texlive[72228] Master/texmf-dist: suanpan-l3 (8sep24)
commits+karl at tug.org
commits+karl at tug.org
Sun Sep 8 21:38:34 CEST 2024
Revision: 72228
https://tug.org/svn/texlive?view=revision&revision=72228
Author: karl
Date: 2024-09-08 21:38:34 +0200 (Sun, 08 Sep 2024)
Log Message:
-----------
suanpan-l3 (8sep24)
Modified Paths:
--------------
trunk/Master/texmf-dist/doc/latex/suanpan-l3/README.md
trunk/Master/texmf-dist/doc/latex/suanpan-l3/suanpan-l3.pdf
trunk/Master/texmf-dist/doc/latex/suanpan-l3/suanpan-l3.tex
trunk/Master/texmf-dist/tex/latex/suanpan-l3/suanpan-l3.sty
Modified: trunk/Master/texmf-dist/doc/latex/suanpan-l3/README.md
===================================================================
--- trunk/Master/texmf-dist/doc/latex/suanpan-l3/README.md 2024-09-08 19:38:16 UTC (rev 72227)
+++ trunk/Master/texmf-dist/doc/latex/suanpan-l3/README.md 2024-09-08 19:38:34 UTC (rev 72228)
@@ -1,7 +1,7 @@
The traditional Chinese 7-bids suanpan(abacus) package based on l3draw
=======
-The `suanpan-l3` package is a traditional Chinese 7-bids abacus drawing package that utilizes l3draw and is developed with Expl3. It can effectively manage both upper and lower bids, while also considering bottom bid, top bid, and hanging bid.
+The `suanpan-l3` package is a traditional Chinese 7-bids abacus drawing package that utilizes l3draw and TikZ and is developed with Expl3. It can effectively manage both upper and lower bids, while also considering bottom bid, top bid, and hanging bid.
The `suanpan-l3` package offers a unique environment for drawing abacuses, denoted as `suanpan`. Within this environment, 8 specialized macros are available for the creation of abacuses. The `\rod` macro is used to lay out a single rod, while the `\rod*` macro draws a counting point on this rod's beam. The `\rods` macro is capable of laying out a set of rods. The `\bid` macro colors the specified bid. The `\bids` macro colors all inner bids that are near the beam, while the `\bids*` macro colors all outer bids that are far from the beam. The `\rodmark` mark the rod on beam. Lastly, the `\mkfame` macro is used to lay out the frame of an abacus.
@@ -19,7 +19,7 @@
基于l3draw的中国传统7珠算盘LaTeX排版宏包
=======
-`suanpan-l3`是一个基于l3draw绘图宏包,用Expl3开发的中国传统7珠圆珠算盘排版宏包,它能够实现普通上珠、下珠和使用底珠、顶珠和悬珠的算盘排版。
+`suanpan-l3`是一个基于l3draw和TikZ绘图宏包,用Expl3开发的中国传统7珠圆珠算盘排版宏包,它能够实现普通上珠、下珠和使用底珠、顶珠和悬珠的算盘排版。
`suanpan-l3`宏包提供了唯一的一个`suanpan`排版环境用于绘制需要排版的算盘,在该环境中使用专用命令`\rod`排版一个档位,`\rod*`命令排版带计位点的档位,`\rods`命令排版一组档位,`\bid`命令为指定的算珠进行着色,`\bids`命令为指定档位的内珠进行着色,`\bids*`命令为指定的档位的外珠进行着色,`\rodmark`命令用于为档位横梁添加标记,`\mkframe`命令排版算盘边框。
Modified: trunk/Master/texmf-dist/doc/latex/suanpan-l3/suanpan-l3.pdf
===================================================================
(Binary files differ)
Modified: trunk/Master/texmf-dist/doc/latex/suanpan-l3/suanpan-l3.tex
===================================================================
--- trunk/Master/texmf-dist/doc/latex/suanpan-l3/suanpan-l3.tex 2024-09-08 19:38:16 UTC (rev 72227)
+++ trunk/Master/texmf-dist/doc/latex/suanpan-l3/suanpan-l3.tex 2024-09-08 19:38:34 UTC (rev 72228)
@@ -124,7 +124,7 @@
{ \__codedoc_cmd:no {#1} { #2 } }
\ExplSyntaxOff
-\def\vers{\texttt{v1.2.0} }
+\def\vers{\texttt{v1.2.2} }
\changes{v1.0.0}{2024/08/20}{first version.}
@@ -145,7 +145,7 @@
\maketitle
\begin{abstract}
- \pkg{suanpan-l3}是一个基于\pkg{l3draw}绘图宏包,用\pkg{Expl3}%
+ \pkg{suanpan-l3}是一个基于\pkg{l3draw}和\pkg{TikZ}绘图宏包,用\pkg{Expl3}%
开发的中国传统7珠圆珠算盘排版宏包,它能够实现使用普通上珠、下珠
和底珠、顶珠及悬珠的算盘排版。该宏包提供了唯一的一个
\env{suanpan}算盘排版环境及仅在该环境中使用的 \tn{rod}、
@@ -176,6 +176,7 @@
\bid{11}{3}{olive5}
\bid{16}{3}{olive5}
\bid{21}{3}{olive5}
+ \rodmark{21,20,19,{},17,16,15,14,13,12,11,10,9,8,7,6,5,{},3,2,1}
\mkframe
\end{suanpan}
\end{center}
@@ -190,9 +191,10 @@
\section{引言}
-\pkg{suanpan-l3}宏包是一个基于\pkg{l3draw}绘图宏包,用\pkg{Expl3}%
-开发的中国传统7珠圆珠算盘排版宏包,它利用\pkg{l3draw}的绘图功能,
-利用简单线条实现了算盘的排版。
+\pkg{suanpan-l3}宏包是一个基于\pkg{l3draw}和\pkg{TikZ}绘图宏包,
+用\pkg{Expl3}开发的中国传统7珠圆珠算盘排版宏包,它利用\pkg{l3draw}%
+宏包,通过\env{l3coffin}容器的平移变换,将使用\pkg{TikZ}宏包绘制的
+算珠、档杆、边框等基本图元组装成算盘,从而实现算盘的排版。
由于圆珠是通过圆角矩形实现的,因此当算珠数量较多时,绘制耗时较长,
其编译速度较慢。
@@ -223,7 +225,7 @@
通过\oarg{外观选项}设置的外观参数仅对\env{suanpan}环境局部有效。
\begin{notezh}
- \env{suanpan}环境中\textsf{不可以出现行}。
+ \env{suanpan}环境中\textsf{不可以出现空行}。
\end{notezh}
\begin{SideBySideExample}[frame=single,numbers=left,%
@@ -260,10 +262,6 @@
宏包还为\tn{rod}命令同时提供了\tn{rod*}星号命令用于排版在
横梁上带有计位点(圆点)的档位。
- \begin{notezh}
- 该命令只能用于\env{suanpan}环境中。
- \end{notezh}
-
\begin{SideBySideExample}[frame=single,numbers=left,%
xrightmargin=.48\linewidth,gobble=2]
\centering
@@ -296,8 +294,6 @@
\begin{notezh}
宏包并没有为\tn{rods}命令提供在横梁排版计位点的档位的
操作。如果需要,则可以使用\tn{rod*}命令对指定档位进行覆盖绘制。
-
- 同样,该命令只能用于\env{suanpan}环境中。
\end{notezh}
\begin{SideBySideExample}[frame=single,numbers=left,%
@@ -315,6 +311,7 @@
change \texttt{pos} to clist and
set default bid draw color to \texttt{innerdrawcolor}.}
\changes{v1.1.3}{2024/09/04}{add highlight to bid(s)}
+
\subsubsection{\tn{bid}算珠着色命令}
\begin{function}{\bid}
@@ -325,16 +322,12 @@
用于将\marg{档位编号}指定的档位中,用逗号分隔的\marg{位置列表}中
指定的所有算珠的填充色设置为\marg{填充颜色}指定的颜色,将其绘制
- 颜色设置为\oarg{绘制颜色}(默认为内珠绘制颜色)。
+ 颜色设置为可选项\oarg{绘制颜色}(默认为内珠绘制颜色)。
一个档位中的\marg{算珠位置}自下向上,按\enquote{$1, 2, \cdots, 11$}%
的顺序进行编号。其中下珠占\enquote{$1, 2, \cdots, 7$}的位置,上珠占
\enquote{$8, 9, 10$}的位置,悬珠占\enquote{$11$}的位置。
- \begin{notezh}
- 同样,该命令只能用于\env{suanpan}环境中。
- \end{notezh}
-
\begin{SideBySideExample}[frame=single,numbers=left,%
xrightmargin=.48\linewidth,gobble=2]
\centering
@@ -374,8 +367,7 @@
(\texttt{outerdrawcolor})。
\begin{notezh}
- 同样,该命令只能用于\env{suanpan}环境中。该命令只能选择
- 内珠或外珠进行着色,不能同时选择内珠和外珠。
+ 该命令只能选择内珠或外珠进行着色,不能同时选择内珠和外珠。
\end{notezh}
\begin{SideBySideExample}[frame=single,numbers=left,%
@@ -404,7 +396,8 @@
\begin{notezh}
如果\marg{标记列表}中的标记数量超出从\oarg{起始档位}开始的
- 档位数,多余的标记将被忽略。
+ 档位数,多余的标记将被忽略。在\marg{标记列表}中,可以用一
+ 对``\{\}''分组符号表示空白标记。
\end{notezh}
\begin{SideBySideExample}[frame=single,numbers=left,%
@@ -413,7 +406,7 @@
\suanpanset{scale = 0.65}
\begin{suanpan}
\rods{0, 2, 6, 6, 9, 0}
- \rodmark{4,3,2,1,0,-1}
+ \rodmark{4,{},2,1,0,-1,-2}
\end{suanpan}
\end{SideBySideExample}
@@ -465,13 +458,13 @@
通过\cs{suanpan}\marg{外观选项}设置的外观属性对后续所有算盘排版
操作有效。
- \begin{notezh}
- 由于\pkg{suanpan-l3}宏包涉及大量绘图操作,因此建议尽量减少在每个
- \env{suanpan}排版环境的可选项中使用\oarg{外观选项}设置,以
- 节约编译时间。如需要更改算盘外观,可以在引用宏包时,通过为宏包
- 添加选项实现,也可以执行\tn{suanpanset}命令进行必要的
- 全局设置或在一定范围内进行统一设置。
- \end{notezh}
+ % \begin{notezh}
+ % 由于\pkg{suanpan-l3}宏包涉及大量绘图操作,因此建议尽量减少在每个
+ % \env{suanpan}排版环境的可选项中使用\oarg{外观选项}设置,以
+ % 节约编译时间。如需要更改算盘外观,可以在引用宏包时,通过为宏包
+ % 添加选项实现,也可以执行\tn{suanpanset}命令进行必要的
+ % 全局设置或在一定范围内进行统一设置。
+ % \end{notezh}
\section{宏包选项}
@@ -494,15 +487,20 @@
布尔型的参数\marg{选项}|=true|中的``|=true|''可以省略。
-\subsection{草稿选项}
+\changes{v1.2.1}{2024/09/05}{change bid(s) figure to a single
+ round cap line in draft and remove
+ all highlight of bid(s), rod(s) and
+ frame.}
-\begin{option}{ opt = draft, desc = {= \meta{草稿选项}}, init=false }
- 设置草稿选项。
+\subsection{草稿模式}
+
+\begin{option}{ opt = draft, desc = {= \meta{草稿模式}}, init=false }
+ 设置草稿模式。
\end{option}
- \oarg{draft}选项会将算珠用矩形表示,取消其圆角效果,从而加快编译速度。
- 同时,草稿选项还会将空档算珠绘制选项\oarg{empty}设置为\texttt{false},
- 也就是不绘制空档上的算珠。
+ \oarg{draft}选项会将算珠用圆角线冒直线实现绘制,取消所有高光效果,
+ 从而加快编译速度。同时,\oarg{draft}选项还会将空档算珠绘制选项\oarg{empty}%
+ 设置为\texttt{false},也就是不绘制空档上的算珠。
\begin{notezh}
在草稿模式下算盘排版会与期望的排版结果有出入。
@@ -520,10 +518,10 @@
\changes{v1.1.2}{2024/08/31}{add empty option to remove bids on empty rod.}
-\subsection{是否绘制空档算珠选项}
+\subsection{是否绘制空档算珠}
-\begin{option}{ opt = empty, desc = {= \meta{空档选项}}, init=true }
- 设置是否绘制空档算珠选项。
+\begin{option}{ opt = empty, desc = {= \meta{空档}}, init=true }
+ 设置是否绘制空档算珠。
\end{option}
\oarg{empty}选项用于选择是否绘制空档上的算珠,如果不绘制,
@@ -543,9 +541,9 @@
\end{suanpan}
\end{SideBySideExample}
-\subsection{线宽选项}
+\subsection{线宽}
-\begin{option}{ opt = linewd, desc = {= \meta{线宽选项}}, init=2pt }
+\begin{option}{ opt = linewd, desc = {= \meta{线宽}}, init=2pt }
设置算盘绘制中的线宽。
\end{option}
@@ -562,6 +560,74 @@
\end{suanpan}
\end{SideBySideExample}
+\changes{v1.2.2}{2024/09/07}{add bidh, bidd, rodd and framew options
+ to set the base size of suanpan.}
+
+\subsection{算珠高度}
+
+\begin{option}{ opt = bidh, desc = {= \meta{算珠高度}}, init=12mm }
+ 设置算珠高度。
+\end{option}
+
+\begin{SideBySideExample}[frame=single,numbers=left,%
+ xrightmargin=.40\linewidth,gobble=2]
+ \centering
+ \suanpanset{scale = 0.65, bidh = 18mm}
+ \begin{suanpan}
+ \rods{0, 6, 0}
+ \end{suanpan}
+\end{SideBySideExample}
+
+\subsection{算珠直径}
+
+\begin{option}{ opt = bidd, desc = {= \meta{算珠直径}}, init=23mm }
+ 设置算珠直径。
+\end{option}
+
+\begin{SideBySideExample}[frame=single,numbers=left,%
+ xrightmargin=.40\linewidth,gobble=2]
+ \centering
+ \suanpanset{scale = 0.65, bidd = 36mm}
+ \begin{suanpan}
+ \rods{0, 6, 0}
+ \end{suanpan}
+\end{SideBySideExample}
+
+\subsection{档杆直径}
+
+\begin{option}{ opt = rodd, desc = {= \meta{档杆直径}}, init=7mm }
+ 设置档杆直径。
+\end{option}
+
+\begin{noteen}
+ 档杆直径rodd应该小于算珠直径bidd。
+\end{noteen}
+
+\begin{SideBySideExample}[frame=single,numbers=left,%
+ xrightmargin=.40\linewidth,gobble=2]
+ \centering
+ \suanpanset{scale = 0.65, rodd = 3mm}
+ \begin{suanpan}
+ \rods{0, 6, 0}
+ \end{suanpan}
+\end{SideBySideExample}
+
+\subsection{边框宽度}
+
+\begin{option}{ opt = framew, desc = {= \meta{边框宽度}}, init=13mm }
+ 设置边框宽度。
+\end{option}
+
+\begin{SideBySideExample}[frame=single,numbers=left,%
+ xrightmargin=.40\linewidth,gobble=2]
+ \centering
+ \suanpanset{scale = 0.65, framew = 7mm}
+ \begin{suanpan}
+ \rods{0, 6, 12, 18, 0}
+ \mkframe
+ \end{suanpan}
+\end{SideBySideExample}
+
\subsection{档位间距}
\begin{option}{ opt = rodsep, desc = {= \meta{档位间距}}, init=3.0pt }
@@ -644,7 +710,7 @@
\begin{SideBySideExample}[frame=single,numbers=left,%
xrightmargin=.37\linewidth,gobble=2]
\centering
- \suanpanset{scale = 0.65, roddraw = brown4}
+ \suanpanset{scale = 0.65, roddraw = red8}
\begin{suanpan}
\rods{0, 6, 0}
\end{suanpan}
@@ -682,7 +748,7 @@
\subsection{外珠填充颜色}
-\begin{option}{ opt = outerfill, desc = {= \meta{外珠填充颜色}}, init=white }
+\begin{option}{ opt = outerfill, desc = {= \meta{外珠填充颜色}}, init=black!40 }
设置外珠填充颜色。
\end{option}
@@ -725,6 +791,25 @@
\end{suanpan}
\end{SideBySideExample}
+\changes{v1.2.2}{2024/09/07}{add font option
+ to set the font of mark.}
+\subsection{标记字体}
+
+\begin{option}{ opt = font, desc = {= \meta{标记字体}}, init=\tn{bfseries}\tn{Large} }
+ 设置标记字体。
+\end{option}
+
+\begin{SideBySideExample}[frame=single,numbers=left,%
+ xrightmargin=.40\linewidth,gobble=2]
+ \centering
+ \suanpanset{scale = 0.65,
+ font=\rmfamily\Huge}
+ \begin{suanpan}
+ \rods{0, 2, 6, 6, 9, 0}
+ \rodmark{4,3,2,1,0,-1}
+ \end{suanpan}
+\end{SideBySideExample}
+
\bigskip
\changes{v1.1.1}{2024/08/30}{add English documentation.}
@@ -745,8 +830,8 @@
\section{Introduction}
\pkg{suanpan-l3} is a traditional Chinese 7-bids suanpan drawing package
-utilizes \pkg{l3draw} and is developed with \pkg{Expl3}. It can
-effectively manage both upper and lower bids, while also considering
+utilizes \pkg{l3draw} and \pkg{TikZ} and is developed with \pkg{Expl3}.
+It can effectively manage both upper and lower bids, while also considering
bottom bid, top bid, and hanging bid.
This package offers a unique environment for drawing suanpan,
@@ -789,6 +874,7 @@
\bid{11}{3}{olive5}
\bid{16}{3}{olive5}
\bid{21}{3}{olive5}
+ \rodmark{21,20,19,{},17,16,15,14,13,12,11,10,9,8,7,6,5,{},3,2,1}
\mkframe
\end{suanpan}
\end{center}
@@ -912,8 +998,8 @@
The \marg{num} is the same as for \tn{rod}; the \marg{fill color} argument
defines the fill color and the comma-seperated \marg{pos list} argument tells
- which bid has to be colored in \marg{num} rod. The \oarg{draw color} argument
- gives the draw color.
+ which bid has to be colored in \marg{num} rod. The \oarg{draw color} option
+ gives the draw color(default is inner bid draw color) .
The \marg{pos} in a rod is numbered from the bottom up in the order
$1, 2, \cdots, 11$. The lower deck bids occupies position
@@ -988,6 +1074,8 @@
\begin{noteen}
If the number of \marg{marker List} exceeds the number of
rods from \oarg{st}, the excess markers will be ignored.
+ In the \marg{marker list}, it is possible to use a pair of
+ ``\{\}'' grouping to indicate blank marker.
\end{noteen}
\begin{SideBySideExample}[frame=single,numbers=left,%
@@ -996,7 +1084,7 @@
\suanpanset{scale = 0.65}
\begin{suanpan}
\rods{0, 2, 6, 6, 9, 0}
- \rodmark{4,3,2,1,0,-1}
+ \rodmark{4,{},2,1,0,-1,-2}
\end{suanpan}
\end{SideBySideExample}
@@ -1076,8 +1164,9 @@
Draft mode.
\end{option}
- The \oarg{draft} option speeds up compilation by canceling
- bids rounded corner effect.
+ The \oarg{draft} option speeds up compilation by drawing
+ bids using round cap line, at same time it will remove all
+ highlight of bid(s), rod(s) and frame.
At the same time \oarg{draft} option will set the \oarg{empty} option
to \texttt{false} to remove all bids on empty rod.
@@ -1138,6 +1227,71 @@
\end{suanpan}
\end{SideBySideExample}
+\subsection{bid height}
+
+\begin{option}{ opt = bidh, desc = {= \meta{bidh}}, init=12mm }
+ The height of bid.
+\end{option}
+
+\begin{SideBySideExample}[frame=single,numbers=left,%
+ xrightmargin=.40\linewidth,gobble=2]
+ \centering
+ \suanpanset{scale = 0.65, bidh = 18mm}
+ \begin{suanpan}
+ \rods{0, 6, 0}
+ \end{suanpan}
+\end{SideBySideExample}
+
+\subsection{bid diameter}
+
+\begin{option}{ opt = bidd, desc = {= \meta{bidd}}, init=23mm }
+ The diameter of bid.
+\end{option}
+
+\begin{SideBySideExample}[frame=single,numbers=left,%
+ xrightmargin=.40\linewidth,gobble=2]
+ \centering
+ \suanpanset{scale = 0.65, bidd = 36mm}
+ \begin{suanpan}
+ \rods{0, 6, 0}
+ \end{suanpan}
+\end{SideBySideExample}
+
+\subsection{rod diameter}
+
+\begin{option}{ opt = rodd, desc = {= \meta{rodd}}, init=7mm }
+ The diameter of rod.
+\end{option}
+
+\begin{noteen}
+ The rodd should be smaller than the bidd.
+\end{noteen}
+
+\begin{SideBySideExample}[frame=single,numbers=left,%
+ xrightmargin=.40\linewidth,gobble=2]
+ \centering
+ \suanpanset{scale = 0.65, rodd = 3mm}
+ \begin{suanpan}
+ \rods{0, 6, 0}
+ \end{suanpan}
+\end{SideBySideExample}
+
+\subsection{frame width}
+
+\begin{option}{ opt = framew, desc = {= \meta{framew}}, init=13mm }
+ The width of frame.
+\end{option}
+
+\begin{SideBySideExample}[frame=single,numbers=left,%
+ xrightmargin=.40\linewidth,gobble=2]
+ \centering
+ \suanpanset{scale = 0.65, framew = 7mm}
+ \begin{suanpan}
+ \rods{0, 6, 12, 18, 0}
+ \mkframe
+ \end{suanpan}
+\end{SideBySideExample}
+
\subsection{rod spacing}
\begin{option}{ opt = rodsep, desc = {= \meta{rodsep}}, init=3.0pt }
@@ -1222,7 +1376,7 @@
\begin{SideBySideExample}[frame=single,numbers=left,%
xrightmargin=.37\linewidth,gobble=2]
\centering
- \suanpanset{scale = 0.65, roddraw = brown4}
+ \suanpanset{scale = 0.65, roddraw = red8}
\begin{suanpan}
\rods{0, 6, 0}
\end{suanpan}
@@ -1260,7 +1414,7 @@
\subsection{outer bids filling color}
-\begin{option}{ opt = outerfill, desc = {= \meta{outerfill}}, init=white }
+\begin{option}{ opt = outerfill, desc = {= \meta{outerfill}}, init=black!40 }
The outer bids filling color。
\end{option}
@@ -1303,6 +1457,23 @@
\end{suanpan}
\end{SideBySideExample}
+\subsection{mark font}
+
+\begin{option}{ opt = font, desc = {= \meta{font}}, init=\tn{bfseries}\tn{Large} }
+ The font of mark(s).
+\end{option}
+
+\begin{SideBySideExample}[frame=single,numbers=left,%
+ xrightmargin=.40\linewidth,gobble=2]
+ \centering
+ \suanpanset{scale = 0.65,
+ font=\rmfamily\Huge}
+ \begin{suanpan}
+ \rods{0, 2, 6, 6, 9, 0}
+ \rodmark{4,3,2,1,0,-1}
+ \end{suanpan}
+\end{SideBySideExample}
+
\end{documentation}
\end{document}
Modified: trunk/Master/texmf-dist/tex/latex/suanpan-l3/suanpan-l3.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/suanpan-l3/suanpan-l3.sty 2024-09-08 19:38:16 UTC (rev 72227)
+++ trunk/Master/texmf-dist/tex/latex/suanpan-l3/suanpan-l3.sty 2024-09-08 19:38:34 UTC (rev 72228)
@@ -13,7 +13,11 @@
% \ProvidesExplPackage{suanpan-l3}{2024-08-31}{v1.1.2} % 添加empty不绘制空档选项
% \ProvidesExplPackage{suanpan-l3}{2024-09-01}{v1.1.3} % 添加bid批处理及绘制颜色选项
% % 将算珠与档杆绘制改为TikZ
-\ProvidesExplPackage{suanpan-l3}{2024-09-04}{v1.2.0} % 添加\lab横梁文字标记命令
+% \ProvidesExplPackage{suanpan-l3}{2024-09-04}{v1.2.0} % 添加\lab横梁文字标记命令
+% \ProvidesExplPackage{suanpan-l3}{2024-09-05}{v1.2.1} % 将草稿模式所有算珠改为圆冒
+% % 直线并取消所有高光特效
+\ProvidesExplPackage{suanpan-l3}{2024-09-07}{v1.2.2} % 为珠高、珠宽、档杆宽度和
+ % 边框宽度添加设置选项
{draw suanpan(abacus) with LaTeX3}
\RequirePackage{l3keys2e}
@@ -22,22 +26,6 @@
\RequirePackage {tikz}
-% Expl3中载入tikz宏包库的补丁
-% \ExplSyntaxOff
-% \patchcmd
-% {\pgfutil at InputIfFileExists}
-% {\input #1}
-% {%
-% \@pushfilename
-% \xdef\@currname{#1}%
-% \input #1 %
-% \@popfilename
-% }
-% {}{}
-% \ExplSyntaxOn
-% % 添加tikz宏包的库
-% \usetikzlibrary{calc}
-
\cs_new:Npn \__suanpan_error:n { \msg_error:nn { suanpan(abacus) } }
% 盒子容器总高度计算函数
@@ -56,7 +44,6 @@
% #2 颜色表达式
\cs_set_nopar:Npn \__suanpan_color_select:nn #1#2
{
- \color_set:nn {#1} {#2}
\colorlet { #1 } { #2 }
}
\cs_generate_variant:Nn \__suanpan_color_select:nn {nx}
@@ -67,8 +54,7 @@
% #3 颜色分量值
\cs_set_nopar:Npn \__suanpan_color_select:nnn #1#2#3
{
- \color_set:nnn {#1} {#2} {#3}
- \definecolor { #1 } { #2 }
+ \definecolor { #1 } { #2 } { #3 }
}
\cs_generate_variant:Nn \__suanpan_color_select:nnn {nnx}
@@ -76,18 +62,18 @@
% 算盘基础尺寸
\dim_new:N \l__suanpan_bid_h_dim
\dim_new:N \l__suanpan_bid_d_dim
+\dim_new:N \l__suanpan_rod_d_dim
+\dim_new:N \l__suanpan_frame_b_dim
\dim_new:N \l__suanpan_bid_sep_dim
\dim_new:N \l__suanpan_rod_sep_dim
-\dim_new:N \l__suanpan_rod_d_dim
-\dim_new:N \l__suanpan_frame_b_dim
% 算盘基础尺寸初值(参考 QBT1747-1993 算盘标准)
\dim_set:Nn \l__suanpan_bid_h_dim { 12mm }
\dim_set:Nn \l__suanpan_bid_d_dim { 23mm }
-\dim_set:Nn \l__suanpan_bid_sep_dim { 1.8pt }
-\dim_set:Nn \l__suanpan_rod_sep_dim { 4pt }
\dim_set:Nn \l__suanpan_rod_d_dim { 7mm }
\dim_set:Nn \l__suanpan_frame_b_dim { 13mm }
+\dim_set:Nn \l__suanpan_bid_sep_dim { 1.8pt }
+\dim_set:Nn \l__suanpan_rod_sep_dim { 3.0pt }
% 半长度
\dim_new:N \l__suanpan_bid_h_half_dim
@@ -123,6 +109,10 @@
\dim_new:N \l__suanpan_bid_upper_dim
% 算珠下边缘
\dim_new:N \l__suanpan_bid_lower_dim
+% 算珠绘制高度
+\dim_new:N \l__suanpan_bid_draw_h_dim
+% 算珠绘制半高度
+\dim_new:N \l__suanpan_bid_draw_h_half_dim
% 算珠圆角半径
\dim_new:N \l__suanpan_bid_arc_dim
% 横梁计位点半径
@@ -133,17 +123,9 @@
\dim_new:N \l__suanpan_support_d_dim
% 档杆总成半宽度
\dim_new:N \l__suanpan_support_d_half_dim
-% 上档杆总成高度
-\dim_new:N \l__suanpan_support_upper_dim
-% 下档杆总成高度
-\dim_new:N \l__suanpan_support_lower_dim
% 档杆总成组装垂直偏移
\dim_new:N \l__suanpan_support_y_offset_dim
-% 上边框外线位置
-\dim_new:N \l__suanpan_frame_outer_upper_dim
-% 下边框外线位置
-\dim_new:N \l__suanpan_frame_outer_lower_dim
% 上边框内线位置
\dim_new:N \l__suanpan_frame_inner_upper_dim
% 下边框内线位置
@@ -154,11 +136,6 @@
% 边框外线高度
\dim_new:N \l__suanpan_frame_outer_h_dim
-% 左右边框外线偏移
-\dim_new:N \l__suanpan_frame_outer_lr_offset_dim
-% 左右边框外线圆角半径
-\dim_new:N \l__suanpan_frame_outer_arc_dim
-
\dim_new:N \l__suanpan_frame_inner_linewidth_dim
\dim_new:N \l__suanpan_frame_outer_linewidth_dim
\dim_new:N \l__suanpan_rod_linewidth_dim
@@ -184,6 +161,7 @@
\tl_new:N \l__suanpan_bid_draw_color_tl
\tl_new:N \l__suanpan_bid_fill_color_tl
\tl_new:N \l__suanpan_scale_tl
+\tl_new:N \l__suanpan_mark_font_tl
% 档位最大值
\int_new:N \l__suanpan_rod_max_int
@@ -249,6 +227,7 @@
{ \l__suanpan_rod_upper_offset_dim + \l__suanpan_rod_upper_h_dim }
% 下档杆位置
\dim_set:Nn \l__suanpan_rod_lower_dim { -\l__suanpan_frame_b_half_dim }
+
% 上边框内线偏移
\dim_set:Nn \l__suanpan_frame_upper_inner_offset_dim
{ \l__suanpan_frame_b_half_dim + \l__suanpan_rod_upper_h_dim }
@@ -263,14 +242,22 @@
\dim_set:Nn \l__suanpan_frame_lower_outer_offset_dim
{ -\l__suanpan_frame_b_dim - \l__suanpan_frame_b_half_dim -
\l__suanpan_rod_lower_h_dim }
+
% 算珠上边缘
\dim_set:Nn \l__suanpan_bid_upper_dim
- { \l__suanpan_bid_h_half_dim - \l__suanpan_bid_sep_dim }
+ { \l__suanpan_bid_h_half_dim - \l__suanpan_bid_sep_dim / 2 }
% 算珠上边缘
\dim_set:Nn \l__suanpan_bid_lower_dim
- { -\l__suanpan_bid_h_half_dim + \l__suanpan_bid_sep_dim }
+ { -\l__suanpan_bid_h_half_dim + \l__suanpan_bid_sep_dim / 2 }
+ % 算珠绘制高度
+ \dim_set:Nn \l__suanpan_bid_draw_h_dim
+ { \l__suanpan_bid_upper_dim - \l__suanpan_bid_lower_dim }
+ % 算珠绘制半高度
+ \dim_set:Nn \l__suanpan_bid_draw_h_half_dim
+ { \l__suanpan_bid_draw_h_dim / 2 }
% 算珠圆角半径
- \dim_set:Nn \l__suanpan_bid_arc_dim { \l__suanpan_bid_upper_dim - 1pt}
+ \dim_set:Nn \l__suanpan_bid_arc_dim
+ { \l__suanpan_bid_draw_h_half_dim - 1pt}
% 横梁计位点半径
\dim_set:Nn \l__suanpan_frame_unit_r_dim { \l__suanpan_frame_b_dim / 4 }
@@ -278,6 +265,7 @@
% 边框外线半宽度
\dim_set:Nn \l__suanpan_frame_outer_half_dim
{ \l__suanpan_frame_outer_linewidth_dim / 2 }
+
% 档杆总成宽度
\dim_set:Nn \l__suanpan_support_d_dim
{ \l__suanpan_bid_d_dim + \l__suanpan_rod_sep_dim }
@@ -284,14 +272,7 @@
% 档杆总成半宽度
\dim_set:Nn \l__suanpan_support_d_half_dim
{ \l__suanpan_bid_d_half_dim + \l__suanpan_rod_sep_dim / 2 }
- % 上档杆总成高度
- \dim_set:Nn \l__suanpan_support_upper_dim
- { \l__suanpan_frame_upper_outer_offset_dim -
- \l__suanpan_frame_outer_half_dim }
- % 下档杆总成高度
- \dim_set:Nn \l__suanpan_support_lower_dim
- { \l__suanpan_frame_lower_outer_offset_dim +
- \l__suanpan_frame_outer_half_dim }
+
% 档杆总成组装垂直偏移
\dim_set:Nn \l__suanpan_support_y_offset_dim
{ ( \l__suanpan_frame_upper_outer_offset_dim -
@@ -301,16 +282,6 @@
\l__suanpan_frame_outer_half_dim
}
- % 上边框外线位置
- \dim_set:Nn \l__suanpan_frame_outer_upper_dim
- { \l__suanpan_frame_upper_inner_offset_dim +
- \l__suanpan_frame_b_dim -
- \l__suanpan_frame_outer_half_dim }
- % 下边框外线位置
- \dim_set:Nn \l__suanpan_frame_outer_lower_dim
- { \l__suanpan_frame_lower_inner_offset_dim -
- \l__suanpan_frame_b_dim +
- \l__suanpan_frame_outer_half_dim }
% 上边框内线位置
\dim_set:Nn \l__suanpan_frame_inner_upper_dim
{ \l__suanpan_frame_upper_inner_offset_dim +
@@ -330,16 +301,6 @@
{ \l__suanpan_rod_upper_h_dim +
\l__suanpan_rod_lower_h_dim +
\l__suanpan_frame_b_dim * 3 }
-
- % 左右边框外线偏移
- \dim_set:Nn \l__suanpan_frame_outer_lr_offset_dim
- { \l__suanpan_support_d_half_dim +
- \l__suanpan_frame_b_dim -
- \l__suanpan_frame_outer_half_dim }
-
- % 左右边框外线圆角半径
- \dim_set:Nn \l__suanpan_frame_outer_arc_dim
- { \l__suanpan_frame_outer_linewidth_dim / 3 - 1pt }
}
% 选项处理
@@ -359,7 +320,7 @@
draft .default:n = true,
draft .initial:n = false,
- % 是否绘制档的数值为0的算珠
+ % 是否绘制档的数值为0的空档算珠
empty .choice:,
empty / true .code:n = { \bool_set_true:N \l__suanpan_empty_rod_bool },
empty / false .code:n = { \bool_set_false:N \l__suanpan_empty_rod_bool },
@@ -407,6 +368,38 @@
},
linewd .initial:n = 2.0pt,
+ % 算珠高度
+ bidh .code:n = {%
+ \dim_set:Nn \l__suanpan_bid_h_dim { #1 }
+ % 计算其它尺寸
+ \__suanpan_dim_calc:
+ },
+ bidh .initial:n = 12mm,
+
+ % 算珠直径
+ bidd .code:n = {%
+ \dim_set:Nn \l__suanpan_bid_d_dim { #1 }
+ % 计算其它尺寸
+ \__suanpan_dim_calc:
+ },
+ bidd .initial:n = 23mm,
+
+ % 档杆直径(应小于算珠直径bidd)
+ rodd .code:n = {%
+ \dim_set:Nn \l__suanpan_rod_d_dim { #1 }
+ % 计算其它尺寸
+ \__suanpan_dim_calc:
+ },
+ rodd .initial:n = 7mm,
+
+ % 边框宽度
+ framew .code:n = {%
+ \dim_set:Nn \l__suanpan_frame_b_dim { #1 }
+ % 计算其它尺寸
+ \__suanpan_dim_calc:
+ },
+ framew .initial:n = 13mm,
+
% 档间间距
rodsep .code:n = {%
\dim_set:Nn \l__suanpan_rod_sep_dim { #1 }
@@ -458,7 +451,14 @@
innerfill .code:n = { \__suanpan_color_select:nn { innerfillcolor } {#1} },
innerfill .initial:n = black,
innerfill* .code:n = { \__suanpan_color_select:nnn { innerfillcolor } #1 },
+ innerfill .initial:n = black,
+ % 横梁标记字符格式
+ font .code:n = {%
+ \tl_gset:Nn \l__suanpan_mark_font_tl {#1}
+ },
+ font .initial:n = \bfseries\Large,
+
unknown .code:n = { \msg_error:nn { suanpan } { unknown-option } }
}
@@ -482,36 +482,41 @@
% 构建内珠(靠近横梁,参与计数)容器(盒子)
\cs_new:Nn \__suanpan_inner_bid_construct:
{
- % 判断是否为草稿模式
- \bool_if:NTF \l__suanpan_draft_bool
- {
- \tikzset{bid/.style ={
- inner~color=innerfillcolor!30,
- outer~color=innerfillcolor,
- draw = innerdrawcolor,
- line~width=\l__suanpan_bid_linewidth_dim,
- }
- }
- }{
- \tikzset{bid/.style = {
- inner~color=innerfillcolor!30,
- outer~color=innerfillcolor,
- draw = innerdrawcolor,
- line~width=\l__suanpan_bid_linewidth_dim,
- rounded~corners=\l__suanpan_bid_arc_dim,
- }
- }
+ \dim_set:Nn \l_tmpa_dim
+ { \l__suanpan_bid_d_half_dim - \l__suanpan_bid_draw_h_half_dim }
+
+ \tikzset{bid/.style = {% 内珠高光填充样式
+ inner~color = innerfillcolor!30,
+ outer~color = innerfillcolor,
+ draw = innerdrawcolor,
+ line~width = \l__suanpan_bid_linewidth_dim,
+ rounded~corners = \l__suanpan_bid_arc_dim,
+ },
+ draftline/.style = {% 内珠草稿模式绘制样式
+ draw = innerfillcolor,
+ line~cap = round,% 圆角线冒
+ line~width = \l__suanpan_bid_draw_h_dim,
}
+ }
\group_begin:
\hcoffin_gset:Nn \l__suanpan_inner_bid_coffin
{
- \begin{tikzpicture}
- \shadedraw[bid]
- ( -\l__suanpan_bid_d_half_dim, \l__suanpan_bid_lower_dim)
- rectangle
- ( \l__suanpan_bid_d_half_dim, \l__suanpan_bid_upper_dim);
- \end{tikzpicture}
+ % 判断是否为草稿模式
+ \bool_if:NTF \l__suanpan_draft_bool
+ {
+ \begin{tikzpicture}
+ \draw[draftline]
+ ( -\l_tmpa_dim, 0) -- ( \l_tmpa_dim, 0);
+ \end{tikzpicture}
+ }{
+ \begin{tikzpicture}
+ \shadedraw[bid]
+ ( -\l__suanpan_bid_d_half_dim, \l__suanpan_bid_lower_dim)
+ rectangle
+ ( \l__suanpan_bid_d_half_dim, \l__suanpan_bid_upper_dim);
+ \end{tikzpicture}
+ }
}
\group_end:
}
@@ -519,36 +524,41 @@
% 构建外珠(远离横梁,不参与计数)容器(盒子)
\cs_new:Nn \__suanpan_outer_bid_construct:
{
- % 判断是否为草稿模式
- \bool_if:NTF \l__suanpan_draft_bool
- {
- \tikzset{bid/.style ={
- inner~color=outerfillcolor!30,
- outer~color=outerfillcolor,
- draw = outerdrawcolor,
- line~width=\l__suanpan_bid_linewidth_dim,
- }
- }
- }{
- \tikzset{bid/.style ={
- inner~color=outerfillcolor!30,
- outer~color=outerfillcolor,
- draw = outerdrawcolor,
- line~width=\l__suanpan_bid_linewidth_dim,
- rounded~corners=\l__suanpan_bid_arc_dim,
- }
- }
+ \dim_set:Nn \l_tmpa_dim
+ { \l__suanpan_bid_d_half_dim - \l__suanpan_bid_draw_h_half_dim }
+
+ \tikzset{bid/.style ={
+ inner~color = outerfillcolor!30,
+ outer~color = outerfillcolor,
+ draw = outerdrawcolor,
+ line~width = \l__suanpan_bid_linewidth_dim,
+ rounded~corners = \l__suanpan_bid_arc_dim,
+ },
+ draftline/.style = {
+ draw = outerfillcolor,
+ line~cap = round,
+ line~width = \l__suanpan_bid_draw_h_dim,
}
+ }
\group_begin:
\hcoffin_gset:Nn \l__suanpan_outer_bid_coffin
{
- \begin{tikzpicture}
- \shadedraw[bid]%
- ( -\l__suanpan_bid_d_half_dim, \l__suanpan_bid_lower_dim)
- rectangle
- ( \l__suanpan_bid_d_half_dim, \l__suanpan_bid_upper_dim);
- \end{tikzpicture}
+ % 判断是否为草稿模式
+ \bool_if:NTF \l__suanpan_draft_bool
+ {
+ \begin{tikzpicture}
+ \draw[draftline]
+ ( -\l_tmpa_dim, 0) -- ( \l_tmpa_dim, 0 );
+ \end{tikzpicture}
+ }{
+ \begin{tikzpicture}
+ \shadedraw[bid]%
+ ( -\l__suanpan_bid_d_half_dim, \l__suanpan_bid_lower_dim)
+ rectangle
+ ( \l__suanpan_bid_d_half_dim, \l__suanpan_bid_upper_dim);
+ \end{tikzpicture}
+ }
}
\group_end:
}
@@ -559,33 +569,40 @@
% #2 填充颜色
\cs_new:Npn \__suanpan_float_bid_construct:nn #1#2
{
- % 判断是否为草稿模式
- \bool_if:NTF \l__suanpan_draft_bool
- {
- \tikzset{bid/.style ={
- line~width=\l__suanpan_bid_linewidth_dim,
- }
- }
- }{
- \tikzset{bid/.style ={
- line~width=\l__suanpan_bid_linewidth_dim,
- rounded~corners=\l__suanpan_bid_arc_dim,
- }
- }
+ \dim_set:Nn \l_tmpa_dim
+ { \l__suanpan_bid_d_half_dim - \l__suanpan_bid_draw_h_half_dim }
+
+ \tikzset{bid/.style ={
+ line~width = \l__suanpan_bid_linewidth_dim,
+ rounded~corners = \l__suanpan_bid_arc_dim,
+ },
+ draftline/.style = {
+ line~cap = round,
+ line~width = \l__suanpan_bid_draw_h_dim,
}
+ }
\group_begin:
\hcoffin_gset:Nn \l__suanpan_float_bid_coffin
{
- \begin{tikzpicture}
- \shadedraw[draw = #1,
- inner~color=#2!30,
- outer~color=#2,
- bid]%
- ( -\l__suanpan_bid_d_half_dim, \l__suanpan_bid_lower_dim)
- rectangle
- ( \l__suanpan_bid_d_half_dim, \l__suanpan_bid_upper_dim);
- \end{tikzpicture}
+ % 判断是否为草稿模式
+ \bool_if:NTF \l__suanpan_draft_bool
+ {
+ \begin{tikzpicture}
+ \draw[draw=#2, draftline]
+ ( -\l_tmpa_dim, 0) -- ( \l_tmpa_dim, 0 );
+ \end{tikzpicture}
+ }{
+ \begin{tikzpicture}
+ \shadedraw[draw = #1,
+ inner~color=#2!30,
+ outer~color=#2,
+ bid]%
+ ( -\l__suanpan_bid_d_half_dim, \l__suanpan_bid_lower_dim)
+ rectangle
+ ( \l__suanpan_bid_d_half_dim, \l__suanpan_bid_upper_dim);
+ \end{tikzpicture}
+ }
}
\group_end:
}
@@ -596,28 +613,32 @@
% TikZ绘图样式
\tikzset{%
rod/.style = {% 档杆
- inner~color=rodfillcolor!30,
- outer~color=rodfillcolor,
- draw=roddrawcolor,
- line~width=\l__suanpan_rod_linewidth_dim,
+ inner~color = rodfillcolor!30,
+ outer~color = rodfillcolor,
+ draw = roddrawcolor,
+ line~width = \l__suanpan_rod_linewidth_dim,
},
beam/.style = {% 横梁
- bottom~color=framecolor!60,
- top~color=framecolor!60,
+ bottom~color = framecolor!60,
+ top~color = framecolor!60,
middle~color = framecolor!5,
},
frame/.style = {% 上下梁
- bottom~color=framecolor!95,
- top~color=framecolor!95,
+ bottom~color = framecolor!95,
+ top~color = framecolor!95,
middle~color = framecolor!15,
},
+ rodline/.style = {% 档杆边线
+ draw = roddrawcolor,
+ line~width = \l__suanpan_rod_linewidth_dim,
+ },
frameinner/.style = {% 内边框线
- draw=framecolor,
- line~width=\l__suanpan_frame_inner_linewidth_dim,
+ draw = framecolor,
+ line~width = \l__suanpan_frame_inner_linewidth_dim,
},
frameouter/.style = {% 外边框线
- draw=framecolor,
- line~width=\l__suanpan_frame_outer_linewidth_dim,
+ draw = framecolor,
+ line~width = \l__suanpan_frame_outer_linewidth_dim,
},
}
@@ -624,76 +645,146 @@
\group_begin:
\hcoffin_gset:Nn \l__suanpan_support_coffin
{
- \begin{tikzpicture}
- % 绘制下杆
- \shadedraw[rod]
- ( -\l__suanpan_rod_d_half_dim, \l__suanpan_rod_lower_offset_dim )
- rectangle
- ( \l__suanpan_rod_d_half_dim, \l__suanpan_rod_lower_dim );
- % 绘制上杆
- \shadedraw[rod]
- ( -\l__suanpan_rod_d_half_dim, \l__suanpan_rod_upper_offset_dim )
- rectangle
- ( \l__suanpan_rod_d_half_dim, \l__suanpan_rod_upper_dim );
+ % 判断是否为草稿模式
+ \bool_if:NTF \l__suanpan_draft_bool
+ {
+ \begin{tikzpicture}
+ % 绘制下杆
+ \draw[rodline]
+ ( -\l__suanpan_rod_d_half_dim, \l__suanpan_rod_lower_offset_dim )
+ rectangle
+ ( \l__suanpan_rod_d_half_dim, \l__suanpan_rod_lower_dim );
+ % 绘制上杆
+ \draw[rodline]
+ ( -\l__suanpan_rod_d_half_dim, \l__suanpan_rod_upper_offset_dim )
+ rectangle
+ ( \l__suanpan_rod_d_half_dim, \l__suanpan_rod_upper_dim );
- % 绘制横梁
- \shade[beam]
- ( -\l__suanpan_support_d_half_dim, -\l__suanpan_frame_b_half_dim )
- rectangle
- ( \l__suanpan_support_d_half_dim, \l__suanpan_frame_b_half_dim );
- \draw[frameinner]
- ( -\l__suanpan_support_d_half_dim, \l__suanpan_frame_b_half_dim )
- --
- ( \l__suanpan_support_d_half_dim, \l__suanpan_frame_b_half_dim );
- \draw[frameinner]
- ( -\l__suanpan_support_d_half_dim, -\l__suanpan_frame_b_half_dim )
- --
- ( \l__suanpan_support_d_half_dim, -\l__suanpan_frame_b_half_dim );
+ % 绘制横梁
+ \draw[frameinner]
+ ( -\l__suanpan_support_d_half_dim, \l__suanpan_frame_b_half_dim )
+ --
+ ( \l__suanpan_support_d_half_dim, \l__suanpan_frame_b_half_dim );
+ \draw[frameinner]
+ ( -\l__suanpan_support_d_half_dim, -\l__suanpan_frame_b_half_dim )
+ --
+ ( \l__suanpan_support_d_half_dim, -\l__suanpan_frame_b_half_dim );
- % 绘制上梁下边线
- \draw[frameinner]
- ( -\l__suanpan_support_d_half_dim,
- \l__suanpan_frame_upper_inner_offset_dim )
- --
- ( \l__suanpan_support_d_half_dim,
- \l__suanpan_frame_upper_inner_offset_dim );
- % 绘制上梁上边线
- \draw[frameouter]
- ( -\l__suanpan_support_d_half_dim,
- \l__suanpan_frame_upper_outer_offset_dim -
- \l__suanpan_frame_outer_linewidth_dim)
- --
- ( \l__suanpan_support_d_half_dim,
- \l__suanpan_frame_upper_outer_offset_dim -
- \l__suanpan_frame_outer_linewidth_dim);
+ % 绘制上梁下边线
+ \draw[frameinner]
+ ( -\l__suanpan_support_d_half_dim,
+ \l__suanpan_frame_upper_inner_offset_dim )
+ --
+ ( \l__suanpan_support_d_half_dim,
+ \l__suanpan_frame_upper_inner_offset_dim );
+ % 绘制上梁上边线
+ \draw[frameouter]
+ ( -\l__suanpan_support_d_half_dim,
+ \l__suanpan_frame_upper_outer_offset_dim -
+ \l__suanpan_frame_outer_linewidth_dim / 2)
+ --
+ ( \l__suanpan_support_d_half_dim,
+ \l__suanpan_frame_upper_outer_offset_dim -
+ \l__suanpan_frame_outer_linewidth_dim / 2);
- % 绘制下梁上边线
- \draw[frameinner]
- ( -\l__suanpan_support_d_half_dim,
- \l__suanpan_frame_lower_inner_offset_dim )
- --
- ( \l__suanpan_support_d_half_dim,
- \l__suanpan_frame_lower_inner_offset_dim );
- % 绘制下梁下边线
- \draw[frameouter]
- ( -\l__suanpan_support_d_half_dim,
- \l__suanpan_frame_lower_outer_offset_dim +
- \l__suanpan_frame_outer_linewidth_dim )
- --
- ( \l__suanpan_support_d_half_dim,
- \l__suanpan_frame_lower_outer_offset_dim +
- \l__suanpan_frame_outer_linewidth_dim );
+ % 绘制下梁上边线
+ \draw[frameinner]
+ ( -\l__suanpan_support_d_half_dim,
+ \l__suanpan_frame_lower_inner_offset_dim )
+ --
+ ( \l__suanpan_support_d_half_dim,
+ \l__suanpan_frame_lower_inner_offset_dim );
+ % 绘制下梁下边线
+ \draw[frameouter]
+ ( -\l__suanpan_support_d_half_dim,
+ \l__suanpan_frame_lower_outer_offset_dim +
+ \l__suanpan_frame_outer_linewidth_dim / 2 )
+ --
+ ( \l__suanpan_support_d_half_dim,
+ \l__suanpan_frame_lower_outer_offset_dim +
+ \l__suanpan_frame_outer_linewidth_dim / 2 );
- % 绘制计位点(黑色圆点)
- \bool_if:NT \l__suanpan_support_unit_bool
- {
- \shade[%
- inner~color=black!40,
- outer~color=black!80,
- ] (0pt, 0pt) circle
- [radius = \l__suanpan_frame_unit_r_dim];
- }
- \end{tikzpicture}
+ % 绘制计位点(黑色圆点)
+ \bool_if:NT \l__suanpan_support_unit_bool
+ {
+ \fill[%
+ fill=black,
+ ] (0pt, 0pt) circle
+ [radius = \l__suanpan_frame_unit_r_dim];
+ }
+ \end{tikzpicture}
+ }{
+ \begin{tikzpicture}
+ % 绘制下杆
+ \shadedraw[rod]
+ ( -\l__suanpan_rod_d_half_dim, \l__suanpan_rod_lower_offset_dim )
+ rectangle
+ ( \l__suanpan_rod_d_half_dim, \l__suanpan_rod_lower_dim );
+ % 绘制上杆
+ \shadedraw[rod]
+ ( -\l__suanpan_rod_d_half_dim, \l__suanpan_rod_upper_offset_dim )
+ rectangle
+ ( \l__suanpan_rod_d_half_dim, \l__suanpan_rod_upper_dim );
+
+ % 绘制横梁
+ \shade[beam]
+ ( -\l__suanpan_support_d_half_dim, -\l__suanpan_frame_b_half_dim )
+ rectangle
+ ( \l__suanpan_support_d_half_dim, \l__suanpan_frame_b_half_dim );
+ \draw[frameinner]
+ ( -\l__suanpan_support_d_half_dim, \l__suanpan_frame_b_half_dim )
+ --
+ ( \l__suanpan_support_d_half_dim, \l__suanpan_frame_b_half_dim );
+ \draw[frameinner]
+ ( -\l__suanpan_support_d_half_dim, -\l__suanpan_frame_b_half_dim )
+ --
+ ( \l__suanpan_support_d_half_dim, -\l__suanpan_frame_b_half_dim );
+
+ % 绘制上梁下边线
+ \draw[frameinner]
+ ( -\l__suanpan_support_d_half_dim,
+ \l__suanpan_frame_upper_inner_offset_dim )
+ --
+ ( \l__suanpan_support_d_half_dim,
+ \l__suanpan_frame_upper_inner_offset_dim );
+ % 绘制上梁上边线
+ \draw[frameouter]
+ ( -\l__suanpan_support_d_half_dim,
+ \l__suanpan_frame_upper_outer_offset_dim -
+ \l__suanpan_frame_outer_linewidth_dim / 2)
+ --
+ ( \l__suanpan_support_d_half_dim,
+ \l__suanpan_frame_upper_outer_offset_dim -
+ \l__suanpan_frame_outer_linewidth_dim / 2);
+
+ % 绘制下梁上边线
+ \draw[frameinner]
+ ( -\l__suanpan_support_d_half_dim,
+ \l__suanpan_frame_lower_inner_offset_dim )
+ --
+ ( \l__suanpan_support_d_half_dim,
+ \l__suanpan_frame_lower_inner_offset_dim );
+ % 绘制下梁下边线
+ \draw[frameouter]
+ ( -\l__suanpan_support_d_half_dim,
+ \l__suanpan_frame_lower_outer_offset_dim +
+ \l__suanpan_frame_outer_linewidth_dim / 2 )
+ --
+ ( \l__suanpan_support_d_half_dim,
+ \l__suanpan_frame_lower_outer_offset_dim +
+ \l__suanpan_frame_outer_linewidth_dim / 2 );
+
+ % 绘制计位点(黑色圆点)
+ \bool_if:NT \l__suanpan_support_unit_bool
+ {
+ \shade[%
+ inner~color=black!40,
+ outer~color=black!80,
+ ] (0pt, 0pt) circle
+ [radius = \l__suanpan_frame_unit_r_dim];
+ }
+ \end{tikzpicture}
+ }
}
\group_end:
}
@@ -736,9 +827,13 @@
{ 0 } { \draw_coffin_use:Nnn \l__suanpan_outer_bid_coffin { hc } { vc } }
{ 1 } { \draw_coffin_use:Nnn \l__suanpan_inner_bid_coffin { hc } { vc } }
{ 2 } { \draw_coffin_use:Nnn \l__suanpan_float_bid_coffin { hc } { vc } }
- }{ Bid~Type~Error! }
+ }{ \msg_error:nnn { suanpan } { bid-type-error } {#2} }
\draw_scope_end:
}
+
+\msg_new:nnn { suanpan } { bid-type-error }
+ { #1~ bid~ type~ is~ unknown. }
+
% 函数变体
\cs_generate_variant:Nn \__suanpan_bid_layout:nn {xx}
@@ -760,7 +855,7 @@
% 算珠
\int_compare:nNnTF { #2 } = { 0 }
{
- % 判断0值算珠是否需要绘制
+ % 判断0值空档算珠是否需要绘制
\bool_if:NT \l__suanpan_empty_rod_bool
{
% 取得档位数字对应算珠位置及内珠/外珠编号
@@ -776,7 +871,7 @@
}
}
}{
- % 不是0值算珠,需要绘制
+ % 不是0值空档算珠,需要绘制
% 取得档位数字对应算珠位置及内珠/外珠编号
\prop_get:NnN \l__suanpan_rods_val_prop { #2 } \l_tmpa_tl
\clist_clear:N \l__suanpan_bids_pos_clist
@@ -792,7 +887,7 @@
\draw_scope_end:
}
-% 指定一个档上某个算珠的颜色
+% 指定一个档位上浮珠的颜色
% #1: 档位编号(从左向右)
% #2: 算珠位置([1, 11])
\cs_new:Npn \__suanpan_float_bid:nn #1#2
@@ -806,7 +901,7 @@
\draw_scope_end:
}
-% 为一个档位添加记录标记
+% 为一个档位添加计数标记
% #1: 档位编号(基于1,从左向右)
% #2: 标记内容
\cs_new:Npn \__suanpan_rod_mark:nn #1#2
@@ -814,7 +909,7 @@
\hcoffin_set:Nn \l_tmpa_coffin
{
\begin{tikzpicture}
- \node at ( 0, 0 ) [font=\bfseries\Large] { #2 };
+ \node at ( 0, 0 ) [font=\l__suanpan_mark_font_tl] { #2 };
\end{tikzpicture}
}
@@ -832,33 +927,38 @@
{
% TikZ绘制样式
\tikzset{%
- hframe/.style ={% 上下梁
- bottom~color=framecolor!95,
- top~color=framecolor!95,
+ hframe/.style = {% 上下梁
+ bottom~color = framecolor!95,
+ top~color = framecolor!95,
middle~color = framecolor!15,
- draw = framecolor,
- line~width = \l__suanpan_frame_inner_linewidth_dim,
+ draw = framecolor,
+ line~width = \l__suanpan_frame_inner_linewidth_dim,
},
- vframe/.style ={% 左右梁
- left~color=framecolor!95,
- right~color=framecolor!95,
+ vframe/.style = {% 左右梁
+ left~color = framecolor!95,
+ right~color = framecolor!95,
middle~color = framecolor!15,
- draw = framecolor,
- line~width = \l__suanpan_frame_inner_linewidth_dim,
+ draw = framecolor,
+ line~width = \l__suanpan_frame_inner_linewidth_dim,
},
- mframe/.style ={% 横梁
- top~color=framecolor!60,
- bottom~color=framecolor!60,
+ mframe/.style = {% 横梁
+ top~color = framecolor!60,
+ bottom~color = framecolor!60,
middle~color = framecolor!5,
+ line~width = \l__suanpan_frame_inner_linewidth_dim,
+ },
+ frameline/.style = {% 梁连线
+ draw = framecolor,
line~width = \l__suanpan_frame_inner_linewidth_dim,
},
- frameline/.style ={% 梁连线
- draw = framecolor,
+ framefill/.style = {% 外框填充
+ draw = framecolor,
+ fill = framecolor,
line~width = \l__suanpan_frame_inner_linewidth_dim,
},
- arcline/.style ={% 转角线
- draw = framecolor,
- line~width = \l__suanpan_frame_inner_linewidth_dim,
+ arcline/.style = {% 转角线
+ draw = framecolor,
+ line~width = \l__suanpan_frame_inner_linewidth_dim,
rounded~corners = \l__suanpan_frame_inner_linewidth_dim / 2,
},
}
@@ -881,65 +981,130 @@
% 上下边框基础容器(盒子)
\hcoffin_set:Nn \l_tmpa_coffin
{
- \begin{tikzpicture}
- \shadedraw[hframe]
- ( 0pt, 0pt ) --
- ++( \l_tmpa_dim, 0) --
- ++( \l__suanpan_frame_b_dim, \l__suanpan_frame_b_dim ) --
- ++( -\l__suanpan_frame_b_dim, 0 ) --
- ++( -\l_tmpa_dim, 0 ) --
- ++( -\l__suanpan_frame_b_dim, 0 ) --
- cycle;
- \end{tikzpicture}
+ % 判断是否为草稿模式
+ \bool_if:NTF \l__suanpan_draft_bool
+ {
+ \begin{tikzpicture}
+ \draw[framefill]
+ ( 0pt, 0pt ) --
+ ++( \l_tmpa_dim, 0) --
+ ++( \l__suanpan_frame_b_dim, \l__suanpan_frame_b_dim ) --
+ ++( -\l__suanpan_frame_b_dim, 0 ) --
+ ++( -\l_tmpa_dim, 0 ) --
+ ++( -\l__suanpan_frame_b_dim, 0 ) --
+ cycle;
+ \end{tikzpicture}
+ }{
+ \begin{tikzpicture}
+ \shadedraw[hframe]
+ ( 0pt, 0pt ) --
+ ++( \l_tmpa_dim, 0) --
+ ++( \l__suanpan_frame_b_dim, \l__suanpan_frame_b_dim ) --
+ ++( -\l__suanpan_frame_b_dim, 0 ) --
+ ++( -\l_tmpa_dim, 0 ) --
+ ++( -\l__suanpan_frame_b_dim, 0 ) --
+ cycle;
+ \end{tikzpicture}
+ }
}
% 左右边框基础容器(盒子)
\hcoffin_set:Nn \l_tmpb_coffin
{
- \begin{tikzpicture}
- \shadedraw[vframe]
- ( 0, 0 ) --
- ++( 0, \l__suanpan_frame_inner_h_dim) --
- ++( -\l__suanpan_frame_b_dim, \l__suanpan_frame_b_dim ) --
- ++( 0, -\l__suanpan_frame_outer_h_dim ) --
- cycle;
- \draw[arcline]
- ( 0, 0 )
- ++( 0, \l__suanpan_frame_inner_h_dim )
- ++( 0, \l__suanpan_frame_b_dim )
- ++( 0, \l__suanpan_frame_inner_linewidth_dim * 0.9 )
- ++( -\l__suanpan_frame_b_half_dim, 0 ) --
- ++( -\l__suanpan_frame_b_half_dim, 0 ) --
- ++( -\l__suanpan_frame_inner_linewidth_dim * 0.9, 0 ) --
- ++( 0, -\l__suanpan_frame_b_half_dim );
- \draw[arcline]
- ( 0, 0 )
- ++( 0, -\l__suanpan_frame_b_dim )
- ++( 0, -\l__suanpan_frame_inner_linewidth_dim * 0.9 )
- ++( -\l__suanpan_frame_b_half_dim, 0 ) --
- ++( -\l__suanpan_frame_b_half_dim, 0 ) --
- ++( -\l__suanpan_frame_inner_linewidth_dim * 0.9, 0 ) --
- ++( 0, \l__suanpan_frame_b_half_dim );
- \end{tikzpicture}
+ % 判断是否为草稿模式
+ \bool_if:NTF \l__suanpan_draft_bool
+ {
+ \begin{tikzpicture}
+ \draw[framefill]
+ ( 0, 0 ) --
+ ++( 0, \l__suanpan_frame_inner_h_dim) --
+ ++( -\l__suanpan_frame_b_dim, \l__suanpan_frame_b_dim ) --
+ ++( 0, -\l__suanpan_frame_outer_h_dim ) --
+ cycle;
+ \draw[arcline]
+ ( 0, 0 )
+ ++( 0, \l__suanpan_frame_inner_h_dim )
+ ++( 0, \l__suanpan_frame_b_dim )
+ ++( 0, \l__suanpan_frame_inner_linewidth_dim * 0.9 )
+ ++( -\l__suanpan_frame_b_half_dim, 0 ) --
+ ++( -\l__suanpan_frame_b_half_dim, 0 ) --
+ ++( -\l__suanpan_frame_inner_linewidth_dim * 0.9, 0 ) --
+ ++( 0, -\l__suanpan_frame_b_half_dim );
+ \draw[arcline]
+ ( 0, 0 )
+ ++( 0, -\l__suanpan_frame_b_dim )
+ ++( 0, -\l__suanpan_frame_inner_linewidth_dim * 0.9 )
+ ++( -\l__suanpan_frame_b_half_dim, 0 ) --
+ ++( -\l__suanpan_frame_b_half_dim, 0 ) --
+ ++( -\l__suanpan_frame_inner_linewidth_dim * 0.9, 0 ) --
+ ++( 0, \l__suanpan_frame_b_half_dim );
+ \end{tikzpicture}
+ }{
+ \begin{tikzpicture}
+ \shadedraw[vframe]
+ ( 0, 0 ) --
+ ++( 0, \l__suanpan_frame_inner_h_dim) --
+ ++( -\l__suanpan_frame_b_dim, \l__suanpan_frame_b_dim ) --
+ ++( 0, -\l__suanpan_frame_outer_h_dim ) --
+ cycle;
+ \draw[arcline]
+ ( 0, 0 )
+ ++( 0, \l__suanpan_frame_inner_h_dim )
+ ++( 0, \l__suanpan_frame_b_dim )
+ ++( 0, \l__suanpan_frame_inner_linewidth_dim * 0.9 )
+ ++( -\l__suanpan_frame_b_half_dim, 0 ) --
+ ++( -\l__suanpan_frame_b_half_dim, 0 ) --
+ ++( -\l__suanpan_frame_inner_linewidth_dim * 0.9, 0 ) --
+ ++( 0, -\l__suanpan_frame_b_half_dim );
+ \draw[arcline]
+ ( 0, 0 )
+ ++( 0, -\l__suanpan_frame_b_dim )
+ ++( 0, -\l__suanpan_frame_inner_linewidth_dim * 0.9 )
+ ++( -\l__suanpan_frame_b_half_dim, 0 ) --
+ ++( -\l__suanpan_frame_b_half_dim, 0 ) --
+ ++( -\l__suanpan_frame_inner_linewidth_dim * 0.9, 0 ) --
+ ++( 0, \l__suanpan_frame_b_half_dim );
+ \end{tikzpicture}
+ }
}
% 横梁接头基础容器(盒子)
\hcoffin_set:Nn \l_tmpc_coffin
{
- \begin{tikzpicture}
- \shade[mframe]
- ( 0pt, 0pt ) --++( 0, \l__suanpan_frame_b_dim) --
- ++(-\l__suanpan_frame_inner_linewidth_dim, 0) --
- ++(-\l__suanpan_frame_b_dim / 3, -\l__suanpan_frame_b_dim / 2) --
- ++( \l__suanpan_frame_b_dim / 3, -\l__suanpan_frame_b_dim / 2) --
- cycle;
- \draw[frameline]%
- ( 0, \l__suanpan_frame_b_dim) --
- ++(-\l__suanpan_frame_inner_linewidth_dim, 0) --
- ++(-\l__suanpan_frame_b_dim / 3, -\l__suanpan_frame_b_dim / 2) --
- ++( \l__suanpan_frame_b_dim / 3, -\l__suanpan_frame_b_dim / 2) --
- ++( \l__suanpan_frame_inner_linewidth_dim, 0);
- \end{tikzpicture}
+ % 判断是否为草稿模式
+ \bool_if:NTF \l__suanpan_draft_bool
+ {
+ \begin{tikzpicture}
+ \fill[fill=white,
+ line~width=\l__suanpan_frame_inner_linewidth_dim]
+ ( 0pt, 0pt ) --++( 0, \l__suanpan_frame_b_dim) --
+ ++(-\l__suanpan_frame_inner_linewidth_dim, 0) --
+ ++(-\l__suanpan_frame_b_dim / 3, -\l__suanpan_frame_b_dim / 2) --
+ ++( \l__suanpan_frame_b_dim / 3, -\l__suanpan_frame_b_dim / 2) --
+ cycle;
+ \draw[frameline]%
+ ( 0, \l__suanpan_frame_b_dim) --
+ ++(-\l__suanpan_frame_inner_linewidth_dim, 0) --
+ ++(-\l__suanpan_frame_b_dim / 3, -\l__suanpan_frame_b_dim / 2) --
+ ++( \l__suanpan_frame_b_dim / 3, -\l__suanpan_frame_b_dim / 2) --
+ ++( \l__suanpan_frame_inner_linewidth_dim, 0);
+ \end{tikzpicture}
+ }{
+ \begin{tikzpicture}
+ \shade[mframe]
+ ( 0pt, 0pt ) --++( 0, \l__suanpan_frame_b_dim) --
+ ++(-\l__suanpan_frame_inner_linewidth_dim, 0) --
+ ++(-\l__suanpan_frame_b_dim / 3, -\l__suanpan_frame_b_dim / 2) --
+ ++( \l__suanpan_frame_b_dim / 3, -\l__suanpan_frame_b_dim / 2) --
+ cycle;
+ \draw[frameline]%
+ ( 0, \l__suanpan_frame_b_dim) --
+ ++(-\l__suanpan_frame_inner_linewidth_dim, 0) --
+ ++(-\l__suanpan_frame_b_dim / 3, -\l__suanpan_frame_b_dim / 2) --
+ ++( \l__suanpan_frame_b_dim / 3, -\l__suanpan_frame_b_dim / 2) --
+ ++( \l__suanpan_frame_inner_linewidth_dim, 0);
+ \end{tikzpicture}
+ }
}
% 布置上边框
@@ -1069,7 +1234,6 @@
% #1 星号命令,绘制计位点(黑色圆点)
% #2 档位编号(基于1,从左向右计数)
% #3 本档数字(0-20,10-15需用到顶珠和底珠,16-20需要用到悬珠)
-% TODO: 会比加了浮珠后的水平尺寸大,未找到原因
\NewDocumentCommand{ \rod }{ s m m }
{
% 记录原状态变量
@@ -1096,12 +1260,12 @@
}
}
+ % 组装一个档位
+ \__suanpan_assemble_rod:nn { #2 }{ #3 }
+
% 统计档位总数
\int_set:Nn \l__suanpan_rod_max_int
{ \int_max:nn { \l__suanpan_rod_max_int }{ #2 } }
-
- % 组装一个档位
- \__suanpan_assemble_rod:nn { #2 }{ #3 }
}
% 排版算盘多个档位,包括档杆和算珠
More information about the tex-live-commits
mailing list.