texlive[72196] Master/texmf-dist: suanpan-l3 (5sep24)
commits+karl at tug.org
commits+karl at tug.org
Thu Sep 5 22:32:01 CEST 2024
Revision: 72196
https://tug.org/svn/texlive?view=revision&revision=72196
Author: karl
Date: 2024-09-05 22:32:01 +0200 (Thu, 05 Sep 2024)
Log Message:
-----------
suanpan-l3 (5sep24)
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-05 15:20:50 UTC (rev 72195)
+++ trunk/Master/texmf-dist/doc/latex/suanpan-l3/README.md 2024-09-05 20:32:01 UTC (rev 72196)
@@ -3,7 +3,7 @@
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 offers a unique environment for drawing abacuses, denoted as `suanpan`. Within this environment, 7 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. Lastly, the `\lrframe` macro is used to lay out the left and right frames of an abacus.
+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.
At the same time, the `suanpan-l3` package offers customization options for abacus, including line width, draw color, fill color, bid space, rod space, etc. These can be configured through package options, `suanpan` environment options, or `\suanpanset` macro.
@@ -21,7 +21,7 @@
`suanpan-l3`是一个基于l3draw绘图宏包,用Expl3开发的中国传统7珠圆珠算盘排版宏包,它能够实现普通上珠、下珠和使用底珠、顶珠和悬珠的算盘排版。
-`suanpan-l3`宏包提供了唯一的一个`suanpan`排版环境用于绘制需要排版的算盘,在该环境中使用专用命令`\rod`排版一个档位,`\rod*`命令排版带计位点的档位,`\rods`命令排版一组档位,`\bid`命令为指定的算珠进行着色,`\bids`命令为指定档位的内珠进行着色,`\bids*`命令为指定的档位的外珠进行着色,`\lrframe`命令排版算盘左右边框。
+`suanpan-l3`宏包提供了唯一的一个`suanpan`排版环境用于绘制需要排版的算盘,在该环境中使用专用命令`\rod`排版一个档位,`\rod*`命令排版带计位点的档位,`\rods`命令排版一组档位,`\bid`命令为指定的算珠进行着色,`\bids`命令为指定档位的内珠进行着色,`\bids*`命令为指定的档位的外珠进行着色,`\rodmark`命令用于为档位横梁添加标记,`\mkframe`命令排版算盘边框。
同时,`suanpan-l3`宏包还为算盘排版提供线宽、颜色、间距等**外观**设置选项,可以通过宏包选项、环境选项对其进行设置,也可以通过`\suanpanset`命令实现外观属性设置。
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-05 15:20:50 UTC (rev 72195)
+++ trunk/Master/texmf-dist/doc/latex/suanpan-l3/suanpan-l3.tex 2024-09-05 20:32:01 UTC (rev 72196)
@@ -124,7 +124,7 @@
{ \__codedoc_cmd:no {#1} { #2 } }
\ExplSyntaxOff
-\def\vers{\texttt{v1.1.1} }
+\def\vers{\texttt{v1.2.0} }
\changes{v1.0.0}{2024/08/20}{first version.}
@@ -149,9 +149,9 @@
开发的中国传统7珠圆珠算盘排版宏包,它能够实现使用普通上珠、下珠
和底珠、顶珠及悬珠的算盘排版。该宏包提供了唯一的一个
\env{suanpan}算盘排版环境及仅在该环境中使用的 \tn{rod}、
- \tn{rods}、\tn{bid}、\tn{bids}和\tn{lrframe}档杆、算珠着色和
- 边框排版命令。同时,该宏包还提供了\tn{suanpanset}命令用于对算盘
- 外观进行设置。
+ \tn{rods}、\tn{bid}、\tn{bids}、\tn{rodmark}和\tn{mkframe}档杆、算珠
+ 着色、横梁标记和边框排版命令。同时,该宏包还提供了\tn{suanpanset}%
+ 命令用于对算盘外观进行设置。
\begin{center}
\begin{suanpan}[framedraw = brown2, scale = 0.45, bidsep=1.5pt,
roddraw = brown3, rodfill = brown4]
@@ -161,22 +161,22 @@
\rod*{4}{3}
\rod*{18}{17}
% 使用顶珠
- \bid{12}{9}{azure7}
- \bid{13}{9}{azure7}
- \bid{14}{9}{azure7}
- \bid{15}{9}{azure7}
- \bid{16}{9}{azure7}
+ \bid{12}{9}{azure5}
+ \bid{13}{9}{azure5}
+ \bid{14}{9}{azure5}
+ \bid{15}{9}{azure5}
+ \bid{16}{9}{azure5}
% 使用悬珠
- \bid{17}{11}{red8}
- \bid{18}{11}{red8}
- \bid{19}{11}{red8}
- \bid{20}{11}{red8}
- \bid{21}{11}{red8}
+ \bid{17}{11}{red5}
+ \bid{18}{11}{red5}
+ \bid{19}{11}{red5}
+ \bid{20}{11}{red5}
+ \bid{21}{11}{red5}
% 使用底珠
- \bid{11}{3}{olive7}
- \bid{16}{3}{olive7}
- \bid{21}{3}{olive7}
- \lrframe{1}{21}
+ \bid{11}{3}{olive5}
+ \bid{16}{3}{olive5}
+ \bid{21}{3}{olive5}
+ \mkframe
\end{suanpan}
\end{center}
\end{abstract}
@@ -213,7 +213,8 @@
在\env{suanpan}环境中,可以通过专用命令\tn{rod}%
(排版算盘的一个档位),\tn{rods}(排版一组档位),
- \tn{bid}(指定算珠颜色),\tn{lrframe}(排版左右边框)
+ \tn{bid}(指定算珠颜色),\tn{bids}(指定内/外珠颜色),
+ \tn{rodmark}(为档位添加标记),\tn{mkframe}(排版边框)
按需实现算盘排版。
在\oarg{外观选项}中可以通过key-value的方式设置线宽、颜色、
@@ -221,6 +222,10 @@
通过\oarg{外观选项}设置的外观参数仅对\env{suanpan}环境局部有效。
+ \begin{notezh}
+ \env{suanpan}环境中\textsf{不可以出现行}。
+ \end{notezh}
+
\begin{SideBySideExample}[frame=single,numbers=left,%
xrightmargin=.48\linewidth,gobble=2]
\centering
@@ -235,6 +240,7 @@
\subsection{\env{suanpan}环境中的专用命令}
+\changes{v1.1.3}{2024/09/04}{add highlight to rod(s) and beam}
\subsubsection{\tn{rod}单一档位排版命令}
\begin{function}{\rod}
@@ -305,17 +311,21 @@
\end{SideBySideExample}
\changes{v1.0.1}{2024/08/26}{rename \tn{bidclr} to \tn{bid}.}
+\changes{v1.1.3}{2024/09/01}{add draw color option to \tn{bid},
+ 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}
\begin{syntax}
- \cs{bid} \marg{档位编号}\marg{算珠位置}\marg{算珠颜色}
+ \cs{bid} \marg{档位编号}\marg{位置列表}\marg{填充颜色}\oarg{绘制颜色}
\end{syntax}
\end{function}
- 用于将\marg{档位编号}指定的档位中,用\marg{算珠位置}指定的算珠
- 设置为\marg{算珠颜色}指定的颜色。同时,该命令还将\marg{算珠颜色}%
- 融合40\%黑色后用于算珠绘制颜色。
+ 用于将\marg{档位编号}指定的档位中,用逗号分隔的\marg{位置列表}中
+ 指定的所有算珠的填充色设置为\marg{填充颜色}指定的颜色,将其绘制
+ 颜色设置为\oarg{绘制颜色}(默认为内珠绘制颜色)。
一个档位中的\marg{算珠位置}自下向上,按\enquote{$1, 2, \cdots, 11$}%
的顺序进行编号。其中下珠占\enquote{$1, 2, \cdots, 7$}的位置,上珠占
@@ -331,32 +341,37 @@
\suanpanset{scale = 0.65}
\begin{suanpan}
\rods{0, 0, 7, 11, 8, 19}
- \bid{1}{1}{gray7}
- \bid{2}{5}{gray7}
- \bid{3}{6}{red8}
- \bid{4}{7}{red8}
- \bid{4}{8}{azure6}
- \bid{4}{9}{yellow9}
+ \bid{1}{1}{brown5}
+ \bid{2}{5}{brown5}
+ \bid{3}{6}{red5}
+ \bid{4}{7}{red5}
+ \bid{4}{8}{azure5}
+ \bid{4}{9}{yellow5}
\bid{5}{10}{violet5}
- \bid{6}{11}{teal4}
+ \bid{6}{4,5,6,11}{teal4}[magenta5]
\end{suanpan}
\end{SideBySideExample}
\changes{v1.1.0}{2024/08/28}{adde \tn{bids} macro.}
+\changes{v1.1.3}{2024/09/01}{change \tn{bids} macro inner bids draw color to
+ \texttt{innerdrawcolor} and outter bids draw
+ color to \texttt{outerdrawcolor}.}
+
\subsubsection{\tn{bids}内珠或外珠着色命令}
\begin{function}{\bids}
\begin{syntax}
- \cs{bids} \marg{档位编号}\marg{档位数字}\marg{算珠颜色}
+ \cs{bids} \marg{档位编号}\marg{档位数字}\marg{填充颜色}
\end{syntax}
\end{function}
用于将\marg{档位编号}指定的档位中,所有\marg{档位数字}的内珠
- 设置为\marg{算珠颜色}指定的颜色。同时,该命令还将\marg{算珠颜色}%
- 融合40\%黑色后用于算珠绘制颜色。
+ 设置为\marg{填充颜色}指定的颜色。同时,该命令还将
+ 算珠绘制颜色设置内珠绘制颜色(\texttt{innerdrawcolor})。
宏包还为\tn{bids}命令同时提供了\tn{bids*}星号命令用于设置该档
- 所有外珠的颜色。
+ 所有外珠的颜色。此时,算珠绘制颜色设置外珠绘制颜色
+ (\texttt{outerdrawcolor})。
\begin{notezh}
同样,该命令只能用于\env{suanpan}环境中。该命令只能选择
@@ -370,25 +385,26 @@
\begin{suanpan}
\rods{0, 0, 7, 11, 8, 19}
\bids{3}{7}{teal4}
- \bids*{5}{8}{azure6}
+ \bids*{5}{8}{azure5}
\end{suanpan}
\end{SideBySideExample}
-\subsubsection{\tn{lrframe}左右边框排版命令}
+\changes{v1.2.0}{2024/09/04}{add \tn{rodmark} macro for marking rod(s) on beams.}
-\begin{function}{\lrframe}
+\subsubsection{\tn{rodmark}横梁标记命令}
+
+\begin{function}{\rodmark}
\begin{syntax}
- \cs{lrframe} \marg{首档编号}\marg{末档编号}
+ \cs{rodmark} \oarg{起始档位}\marg{标记列表}
\end{syntax}
\end{function}
- 用于在\marg{首档编号}指定的档位左边和\marg{末档编号}指定的档位
- 右边排版算盘的左右边框。
+ 用于从\oarg{起始档位}可选项指定的档位开始,用\marg{标记列表}%
+ 中逗号分隔的标记在算盘横梁上为各档位添加标记。
\begin{notezh}
- 同样,该命令只能用于\env{suanpan}环境中。另外,其左右边框应该
- 同时按正确第一档和最后一档档位编号绘制,否则会造成结果容器(盒子)
- 尺寸异常的问题。
+ 如果\marg{标记列表}中的标记数量超出从\oarg{起始档位}开始的
+ 档位数,多余的标记将被忽略。
\end{notezh}
\begin{SideBySideExample}[frame=single,numbers=left,%
@@ -396,8 +412,41 @@
\centering
\suanpanset{scale = 0.65}
\begin{suanpan}
+ \rods{0, 2, 6, 6, 9, 0}
+ \rodmark{4,3,2,1,0,-1}
+ \end{suanpan}
+\end{SideBySideExample}
+
+\begin{SideBySideExample}[frame=single,numbers=left,%
+ xrightmargin=.48\linewidth,gobble=2]
+ \centering
+ \suanpanset{scale = 0.65}
+ \begin{suanpan}
+ \rods{0, 2, 6, 6, 9, 0}
+ \rodmark[2]{千,百,十,个}
+ \end{suanpan}
+\end{SideBySideExample}
+
+\changes{v1.1.3}{2024/09/04}{highlight all frame and remove arguments of \tn{lrframe},
+ at the same time change \tn{lrframe} to \tn{mkframe}.}
+
+\subsubsection{\tn{mkframe}边框排版命令}
+
+\begin{function}{\mkframe}
+ \begin{syntax}
+ \cs{mkframe}
+ \end{syntax}
+\end{function}
+
+ 用于排版算盘的边框。
+
+\begin{SideBySideExample}[frame=single,numbers=left,%
+ xrightmargin=.48\linewidth,gobble=2]
+ \centering
+ \suanpanset{scale = 0.65}
+ \begin{suanpan}
\rods{0, 6, 12, 18, 0}
- \lrframe{1}{5}
+ \mkframe
\end{suanpan}
\end{SideBySideExample}
@@ -452,6 +501,8 @@
\end{option}
\oarg{draft}选项会将算珠用矩形表示,取消其圆角效果,从而加快编译速度。
+ 同时,草稿选项还会将空档算珠绘制选项\oarg{empty}设置为\texttt{false},
+ 也就是不绘制空档上的算珠。
\begin{notezh}
在草稿模式下算盘排版会与期望的排版结果有出入。
@@ -467,6 +518,31 @@
\end{suanpan}
\end{SideBySideExample}
+\changes{v1.1.2}{2024/08/31}{add empty option to remove bids on empty rod.}
+
+\subsection{是否绘制空档算珠选项}
+
+\begin{option}{ opt = empty, desc = {= \meta{空档选项}}, init=true }
+ 设置是否绘制空档算珠选项。
+\end{option}
+
+ \oarg{empty}选项用于选择是否绘制空档上的算珠,如果不绘制,
+ 在一定程度上可以加快编译速度。
+
+ \begin{notezh}
+ 如有需要,可以使用\tn{bid}或\tn{bids*}命令为空档绘制算珠。
+ \end{notezh}
+
+\begin{SideBySideExample}[frame=single,numbers=left,%
+ xrightmargin=.53\linewidth,gobble=2]
+ \centering
+ \suanpanset{scale = 0.65}
+ \begin{suanpan}[empty = false]
+ \rods{0, 6, 12, 18, 0}
+ \bids*{5}{0}{gray6}
+ \end{suanpan}
+\end{SideBySideExample}
+
\subsection{线宽选项}
\begin{option}{ opt = linewd, desc = {= \meta{线宽选项}}, init=2pt }
@@ -475,7 +551,7 @@
\oarg{linewd}选项用于设置算盘边框内线线宽,同时会将
边框外线设置为linewd的7.00倍,将档杆和算珠线宽
- 设置为linewd的1.00倍。
+ 设置为linewd的0.2倍。
\begin{SideBySideExample}[frame=single,numbers=left,%
xrightmargin=.40\linewidth,gobble=2]
@@ -598,7 +674,7 @@
\begin{SideBySideExample}[frame=single,numbers=left,%
xrightmargin=.37\linewidth,gobble=2]
\centering
- \suanpanset{scale = 0.65, outerdraw = yellow4}
+ \suanpanset{scale = 0.65, outerdraw = red8}
\begin{suanpan}
\rods{0, 6, 0}
\end{suanpan}
@@ -613,7 +689,7 @@
\begin{SideBySideExample}[frame=single,numbers=left,%
xrightmargin=.37\linewidth,gobble=2]
\centering
- \suanpanset{scale = 0.65, outerfill = yellow9}
+ \suanpanset{scale = 0.65, outerfill = yellow6}
\begin{suanpan}
\rods{0, 6, 0}
\end{suanpan}
@@ -643,7 +719,7 @@
\begin{SideBySideExample}[frame=single,numbers=left,%
xrightmargin=.37\linewidth,gobble=2]
\centering
- \suanpanset{scale = 0.65, innerfill = red9}
+ \suanpanset{scale = 0.65, innerfill = red5}
\begin{suanpan}
\rods{0, 6, 0}
\end{suanpan}
@@ -674,13 +750,14 @@
bottom bid, top bid, and hanging bid.
This package offers a unique environment for drawing suanpan,
-denoted as \env{suanpan}. Within this environment, 7 specialized macros
+denoted as \env{suanpan}. Within this environment, 8 specialized macros
are available for the creation of suanpan. The \tn{rod} macro is used
to lay out a single rod, while the \tn{rod*} macro draws a counting point
on this rod’s beam. The \tn{rods} macro is capable of laying out a set of rods.
The \tn{bid} macro colors the specified bid. The \tn{bids} macro colors
all inner bids that are near the beam, while the \tn{bids*} macro colors
-all outer bids that are far from the beam. Lastly, the \tn{lrframe} macro
+all outer bids that are far from the beam. The \tn{rodmark} macro mark all rods
+on beam. Lastly, the \tn{mkframe} macro
is used to lay out the left and right frames of an abacus.
At the same time, the package offers customization options for suanpan,
@@ -697,22 +774,22 @@
\rod*{4}{3}
\rod*{18}{17}
% top bid
- \bid{12}{9}{azure7}
- \bid{13}{9}{azure7}
- \bid{14}{9}{azure7}
- \bid{15}{9}{azure7}
- \bid{16}{9}{azure7}
+ \bid{12}{9}{azure5}
+ \bid{13}{9}{azure5}
+ \bid{14}{9}{azure5}
+ \bid{15}{9}{azure5}
+ \bid{16}{9}{azure5}
% hanging bid
- \bid{17}{11}{red8}
- \bid{18}{11}{red8}
- \bid{19}{11}{red8}
- \bid{20}{11}{red8}
- \bid{21}{11}{red8}
+ \bid{17}{11}{red5}
+ \bid{18}{11}{red5}
+ \bid{19}{11}{red5}
+ \bid{20}{11}{red5}
+ \bid{21}{11}{red5}
% bottom bid
- \bid{11}{3}{olive7}
- \bid{16}{3}{olive7}
- \bid{21}{3}{olive7}
- \lrframe{1}{21}
+ \bid{11}{3}{olive5}
+ \bid{16}{3}{olive5}
+ \bid{21}{3}{olive5}
+ \mkframe
\end{suanpan}
\end{center}
@@ -731,7 +808,7 @@
Typesetting 7-bids Chinese suanpan with \oarg{options}.
Within the \env{suanpan} environment, \tn{rod}, \tn{rod*}, \tn{rods}, \tn{bid},
- \tn{bids}, \tn{bids*} and \tn{lrframe} 7 specialized macros
+ \tn{bids}, \tn{bids*}, \tn{rodmark} and \tn{mkframe} 8 specialized macros
are available for the creation of suanpan.
\oarg{options} is a key-value list for line width, draw color, fill color,
@@ -739,6 +816,10 @@
\oarg{options} is environment's local setting.
+ \begin{noteen}
+ You should remove all blank line in \env{suanpan} environment.
+ \end{noteen}
+
\begin{SideBySideExample}[frame=single,numbers=left,%
xrightmargin=.48\linewidth,gobble=2]
\centering
@@ -823,19 +904,17 @@
\begin{function}{\bid}
\begin{syntax}
- \cs{bid} \marg{num}\marg{pos}\marg{color}
+ \cs{bid} \marg{num}\marg{pos list}\marg{fill color}\oarg{draw color}
\end{syntax}
\end{function}
The \tn{bid} macro fills the specified bid.
- The \marg{num} is the same as for \tn{rod}; the \marg{color} argument
- defines the fill color and the \marg{pos} argument tells which bid has to
- be colored in \marg{num} rod.
+ 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.
- This macro also blends \marg{color} by 40\% black to be used for bid
- drawing 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
$1, 2, \cdots, 7$, the upper deck bids occupies position $8, 9, 10$,
@@ -847,14 +926,14 @@
\suanpanset{scale = 0.65}
\begin{suanpan}
\rods{0, 0, 7, 11, 8, 19}
- \bid{1}{1}{gray7}
- \bid{2}{5}{gray7}
- \bid{3}{6}{red8}
- \bid{4}{7}{red8}
- \bid{4}{8}{azure6}
- \bid{4}{9}{yellow9}
+ \bid{1}{1}{brown5}
+ \bid{2}{5}{brown5}
+ \bid{3}{6}{red5}
+ \bid{4}{7}{red5}
+ \bid{4}{8}{azure5}
+ \bid{4}{9}{yellow5}
\bid{5}{10}{violet5}
- \bid{6}{11}{teal4}
+ \bid{6}{4,5,6,11}{teal4}[magenta5]
\end{suanpan}
\end{SideBySideExample}
@@ -871,10 +950,11 @@
\marg{num} and \marg{color} are the same as for \tn{bid};
the \marg{val} argument is the same as for \tn{rod}.
- The \marg{color} is fill color for inner bids. it also blends
- \marg{color} by 40\% black to be used for inner bids drawing color.
+ The \marg{color} is fill color for inner bids. it also set
+ \texttt{innercolor} to be used for inner bids drawing color.
The starred version \tn{bids*} is used to color outer bids of \marg{num} rod.
+ it also set \texttt{outercolor} to be used for inner bids drawing color.
\begin{noteen}
This macro can only select the inner bids or the outer bids for coloring,
@@ -888,31 +968,66 @@
\begin{suanpan}
\rods{0, 0, 7, 11, 8, 19}
\bids{3}{7}{teal4}
- \bids*{5}{8}{azure6}
+ \bids*{5}{8}{azure5}
\end{suanpan}
\end{SideBySideExample}
-\subsubsection{\tn{lrframe}---left and right frame}
+\subsubsection{\tn{rodmark} rod(s) marking on beam}
-\begin{function}{\lrframe}
+\begin{function}{\rodmark}
\begin{syntax}
- \cs{lrframe} \marg{first num}\marg{last num}
+ \cs{rodmark} \oarg{st}\marg{maker list}
\end{syntax}
\end{function}
- The \tn{lrframe} macro is used to lay out the left and right frames of
- a suanpan.
+ The \tn{rodmark} macro marks the rod(s) on the beam.
- The \marg{first num} argument tells which rod is the first rod and
- the \marg{last num} argument tells which rod is the last rod.
+ The \oarg{st} argument is the start rod and \marg{marker list}
+ is the marker list.
+ \begin{noteen}
+ If the number of \marg{marker List} exceeds the number of
+ rods from \oarg{st}, the excess markers will be ignored.
+ \end{noteen}
+
\begin{SideBySideExample}[frame=single,numbers=left,%
xrightmargin=.48\linewidth,gobble=2]
\centering
\suanpanset{scale = 0.65}
\begin{suanpan}
+ \rods{0, 2, 6, 6, 9, 0}
+ \rodmark{4,3,2,1,0,-1}
+ \end{suanpan}
+\end{SideBySideExample}
+
+\begin{SideBySideExample}[frame=single,numbers=left,%
+ xrightmargin=.48\linewidth,gobble=2]
+ \centering
+ \suanpanset{scale = 0.65}
+ \begin{suanpan}
+ \rods{0, 2, 6, 6, 9, 0}
+ \rodmark[2]{Q,C,X,I}
+ \end{suanpan}
+\end{SideBySideExample}
+
+\subsubsection{\tn{mkframe}---layout frame}
+
+\begin{function}{\mkframe}
+ \begin{syntax}
+ \cs{mkframe}
+ \end{syntax}
+\end{function}
+
+ The \tn{mkframe} macro is used to lay out the frames of
+ a suanpan.
+
+\begin{SideBySideExample}[frame=single,numbers=left,%
+ xrightmargin=.48\linewidth,gobble=2]
+ \centering
+ \suanpanset{scale = 0.65}
+ \begin{suanpan}
\rods{0, 6, 12, 18, 0}
- \lrframe{1}{5}
+ \mkframe
\end{suanpan}
\end{SideBySideExample}
@@ -961,9 +1076,12 @@
Draft mode.
\end{option}
-The \oarg{draft} option speeds up compilation by canceling
+ The \oarg{draft} option speeds up compilation by canceling
bids rounded corner effect.
+ At the same time \oarg{draft} option will set the \oarg{empty} option
+ to \texttt{false} to remove all bids on empty rod.
+
\begin{noteen}
Suanpan layout in draft mode may differ from the desired layout.
\end{noteen}
@@ -978,6 +1096,29 @@
\end{suanpan}
\end{SideBySideExample}
+\subsection{empty}
+
+\begin{option}{ opt = empty, desc = {= \meta{empty}}, init=true }
+ Remove bids on empty rod or not.
+\end{option}
+
+ The \oarg{empty} option will remove all bids on empty rod.
+
+ \begin{noteen}
+ If necessary, you can use the \tn{bid} or \tn{bids*} macro to
+ draw bid(s) for the empty rod.
+ \end{noteen}
+
+\begin{SideBySideExample}[frame=single,numbers=left,%
+ xrightmargin=.53\linewidth,gobble=2]
+ \centering
+ \suanpanset{scale = 0.65}
+ \begin{suanpan}[empty=false]
+ \rods{0, 6, 12, 18, 0}
+ \bids*{5}{0}{gray6}
+ \end{suanpan}
+\end{SideBySideExample}
+
\subsection{line width}
\begin{option}{ opt = linewd, desc = {= \meta{linewd}}, init=2pt }
@@ -1111,7 +1252,7 @@
\begin{SideBySideExample}[frame=single,numbers=left,%
xrightmargin=.37\linewidth,gobble=2]
\centering
- \suanpanset{scale = 0.65, outerdraw = yellow4}
+ \suanpanset{scale = 0.65, outerdraw = red8}
\begin{suanpan}
\rods{0, 6, 0}
\end{suanpan}
@@ -1126,7 +1267,7 @@
\begin{SideBySideExample}[frame=single,numbers=left,%
xrightmargin=.37\linewidth,gobble=2]
\centering
- \suanpanset{scale = 0.65, outerfill = yellow9}
+ \suanpanset{scale = 0.65, outerfill = yellow6}
\begin{suanpan}
\rods{0, 6, 0}
\end{suanpan}
@@ -1156,7 +1297,7 @@
\begin{SideBySideExample}[frame=single,numbers=left,%
xrightmargin=.37\linewidth,gobble=2]
\centering
- \suanpanset{scale = 0.65, innerfill = red9}
+ \suanpanset{scale = 0.65, innerfill = red5}
\begin{suanpan}
\rods{0, 6, 0}
\end{suanpan}
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-05 15:20:50 UTC (rev 72195)
+++ trunk/Master/texmf-dist/tex/latex/suanpan-l3/suanpan-l3.sty 2024-09-05 20:32:01 UTC (rev 72196)
@@ -9,7 +9,11 @@
\RequirePackage{expl3}
% \ProvidesExplPackage{suanpan}{2024-08-20}{v1.0.0} % 初稿
% \ProvidesExplPackage{suanpan}{2024-08-28}{v1.1.0} % 优化(统一尺寸计算,添加空白占位)
-\ProvidesExplPackage{suanpan-l3}{2024-08-30}{v1.1.1} % 更名为suanpan-l3
+% \ProvidesExplPackage{suanpan-l3}{2024-08-30}{v1.1.1} % 更名为suanpan-l3
+% \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横梁文字标记命令
{draw suanpan(abacus) with LaTeX3}
\RequirePackage{l3keys2e}
@@ -16,6 +20,24 @@
\RequirePackage{xparse}
\RequirePackage{l3draw}
+\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) } }
% 盒子容器总高度计算函数
@@ -35,6 +57,7 @@
\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}
@@ -45,6 +68,7 @@
\cs_set_nopar:Npn \__suanpan_color_select:nnn #1#2#3
{
\color_set:nnn {#1} {#2} {#3}
+ \definecolor { #1 } { #2 }
}
\cs_generate_variant:Nn \__suanpan_color_select:nnn {nnx}
@@ -63,7 +87,7 @@
\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 { 11mm }
+\dim_set:Nn \l__suanpan_frame_b_dim { 13mm }
% 半长度
\dim_new:N \l__suanpan_bid_h_half_dim
@@ -83,6 +107,10 @@
\dim_new:N \l__suanpan_rod_upper_offset_dim
% 下档杆偏移
\dim_new:N \l__suanpan_rod_lower_offset_dim
+% 上档杆位置
+\dim_new:N \l__suanpan_rod_upper_dim
+% 下档杆位置
+\dim_new:N \l__suanpan_rod_lower_dim
% 上边框内线偏移
\dim_new:N \l__suanpan_frame_upper_inner_offset_dim
% 下边框内线偏移
@@ -120,6 +148,12 @@
\dim_new:N \l__suanpan_frame_inner_upper_dim
% 下边框内线位置
\dim_new:N \l__suanpan_frame_inner_lower_dim
+
+% 边框内线高度
+\dim_new:N \l__suanpan_frame_inner_h_dim
+% 边框外线高度
+\dim_new:N \l__suanpan_frame_outer_h_dim
+
% 左右边框外线偏移
\dim_new:N \l__suanpan_frame_outer_lr_offset_dim
% 左右边框外线圆角半径
@@ -136,6 +170,7 @@
\bool_new:N \l__suanpan_support_unit_bool
\bool_set_false:N \l__suanpan_support_unit_bool
\bool_new:N \l__suanpan_draft_bool
+\bool_new:N \l__suanpan_empty_rod_bool
% 容器(盒子)
\coffin_new:N \l__suanpan_inner_bid_coffin
@@ -142,7 +177,8 @@
\coffin_new:N \l__suanpan_outer_bid_coffin
\coffin_new:N \l__suanpan_float_bid_coffin
\coffin_new:N \l__suanpan_support_coffin
-\coffin_new:N \l__suanpan_empty_support_coffin
+\coffin_new:N \l_tmpc_coffin
+\coffin_new:N \l_tmpd_coffin
% 凭据表(Token)
\tl_new:N \l__suanpan_bid_draw_color_tl
@@ -208,6 +244,11 @@
% 下档杆偏移
\dim_set:Nn \l__suanpan_rod_lower_offset_dim
{ -\l__suanpan_frame_b_half_dim - \l__suanpan_rod_lower_h_dim }
+ % 上档杆位置
+ \dim_set:Nn \l__suanpan_rod_upper_dim
+ { \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 }
@@ -278,6 +319,18 @@
\dim_set:Nn \l__suanpan_frame_inner_lower_dim
{ \l__suanpan_frame_lower_inner_offset_dim -
\l__suanpan_frame_inner_linewidth_dim / 2 }
+
+ % 边框内线高度
+ \dim_set:Nn \l__suanpan_frame_inner_h_dim
+ { \l__suanpan_rod_upper_h_dim +
+ \l__suanpan_rod_lower_h_dim +
+ \l__suanpan_frame_b_dim }
+ % 边框外线高度
+ \dim_set:Nn \l__suanpan_frame_outer_h_dim
+ { \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 +
@@ -293,12 +346,26 @@
% ============宏包选项=================
\keys_define:nn { suanpan }
{
+ % 草稿模式
draft .choice:,
- draft / true .code:n = { \bool_set_true:N \l__suanpan_draft_bool },
- draft / false .code:n = { \bool_set_false:N \l__suanpan_draft_bool },
+ draft / true .code:n = {%
+ \bool_set_true:N \l__suanpan_draft_bool
+ \bool_set_false:N \l__suanpan_empty_rod_bool
+ },
+ draft / false .code:n = {%
+ \bool_set_false:N \l__suanpan_draft_bool
+ \bool_set_true:N \l__suanpan_empty_rod_bool
+ },
draft .default:n = true,
draft .initial:n = false,
+ % 是否绘制档的数值为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 },
+ empty .default:n = true,
+ empty .initial:n = true,
+
unknown .code:n = { \msg_error:nn { suanpan } { unknown-option } }
}
@@ -323,7 +390,7 @@
\fp_to_dim:n
{
\fp_eval:n {%
- \l__suanpan_frame_inner_linewidth_dim * 1.0 }
+ \l__suanpan_frame_inner_linewidth_dim * 0.2 }
}
}
% 算珠线宽
@@ -332,7 +399,7 @@
\fp_to_dim:n
{
\fp_eval:n {%
- \l__suanpan_frame_inner_linewidth_dim * 1.0 }
+ \l__suanpan_frame_inner_linewidth_dim * 0.2 }
}
}
% 计算其它尺寸
@@ -371,7 +438,7 @@
roddraw* .code:n = { \__suanpan_color_select:nnn { roddrawcolor } #1 },
% 档杆填充颜色
rodfill .code:n = { \__suanpan_color_select:nn { rodfillcolor } {#1} },
- rodfill .initial:n = white,
+ rodfill .initial:n = black!20,
rodfill* .code:n = { \__suanpan_color_select:nnn { rodfillcolor } #1 },
% 外珠绘图颜色
@@ -380,7 +447,7 @@
outerdraw* .code:n = { \__suanpan_color_select:nnn { outerdrawcolor } #1 },
% 外珠填充颜色
outerfill .code:n = { \__suanpan_color_select:nn { outerfillcolor } {#1} },
- outerfill .initial:n = white,
+ outerfill .initial:n = black!40,
outerfill* .code:n = { \__suanpan_color_select:nnn { outerfillcolor } #1 },
% 内珠绘图颜色
@@ -399,9 +466,6 @@
\msg_new:nnn { suanpan } { unknown-option }
{ package~ option~ "\l_keys_key_tl"~ is~ unknown. }
-% 将文档类选项传给suanpan
-\ProcessKeysOptions { suanpan }
-
% 选项默认值
\keys_set:nn { suanpan }
{
@@ -408,31 +472,46 @@
linewd = 2.0pt,
rodsep = 3.0pt,
bidsep = 1.8pt,
- scale = 1.0,
+ scale = 1.0,
+ empty = true,
}
+% 将文档类选项传给suanpan
+\ProcessKeysOptions { suanpan }
+
% 构建内珠(靠近横梁,参与计数)容器(盒子)
\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,
+ }
+ }
+ }
+
\group_begin:
\hcoffin_gset:Nn \l__suanpan_inner_bid_coffin
{
- \draw_begin:
- \color_stroke:n { innerdrawcolor }
- \draw_linewidth:n { \l__suanpan_bid_linewidth_dim }
- % 圆角矩形绘制较为耗时,draft模式时将绘制直角矩形
- \bool_if:NF \l__suanpan_draft_bool
- {
- \draw_path_corner_arc:nn{ \l__suanpan_bid_arc_dim }
- { \l__suanpan_bid_arc_dim }
- }
- % 绘制算珠
- \draw_path_rectangle_corners:nn
- { -\l__suanpan_bid_d_half_dim, \l__suanpan_bid_lower_dim}
- { \l__suanpan_bid_d_half_dim, \l__suanpan_bid_upper_dim}
- \color_fill:n { innerfillcolor }
- \draw_path_use_clear:n { stroke, fill }
- \draw_end:
+ \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:
}
@@ -440,25 +519,36 @@
% 构建外珠(远离横梁,不参与计数)容器(盒子)
\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,
+ }
+ }
+ }
+
\group_begin:
\hcoffin_gset:Nn \l__suanpan_outer_bid_coffin
{
- \draw_begin:
- \color_stroke:n { outerdrawcolor }
- \draw_linewidth:n { \l__suanpan_bid_linewidth_dim }
- % 圆角矩形绘制较为耗时,draft模式时将绘制直角矩形
- \bool_if:NF \l__suanpan_draft_bool
- {
- \draw_path_corner_arc:nn{ \l__suanpan_bid_arc_dim }
- { \l__suanpan_bid_arc_dim }
- }
- % 绘制算珠
- \draw_path_rectangle_corners:nn
- { -\l__suanpan_bid_d_half_dim, \l__suanpan_bid_lower_dim}
- { \l__suanpan_bid_d_half_dim, \l__suanpan_bid_upper_dim}
- \color_fill:n { outerfillcolor }
- \draw_path_use_clear:n { stroke, fill }
- \draw_end:
+ \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:
}
@@ -465,27 +555,37 @@
% 构建浮珠容器(盒子)
% 浮珠指可以在算盘中任意布置的算珠
+% #1 绘制颜色
+% #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,
+ }
+ }
+ }
+
\group_begin:
\hcoffin_gset:Nn \l__suanpan_float_bid_coffin
{
- \draw_begin:
- \color_stroke:n { #1 }
- \draw_linewidth:n { \l__suanpan_bid_linewidth_dim }
- % 圆角矩形绘制较为耗时,draft模式时将绘制直角矩形
- \bool_if:NF \l__suanpan_draft_bool
- {
- \draw_path_corner_arc:nn{ \l__suanpan_bid_arc_dim }
- { \l__suanpan_bid_arc_dim }
- }
- % 绘制算珠
- \draw_path_rectangle_corners:nn
- { -\l__suanpan_bid_d_half_dim, \l__suanpan_bid_lower_dim}
- { \l__suanpan_bid_d_half_dim, \l__suanpan_bid_upper_dim}
- \color_fill:n { #2 }
- \draw_path_use_clear:n { stroke, fill }
- \draw_end:
+ \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:
}
@@ -493,110 +593,111 @@
% 构建档杆容器(盒子)
\cs_new:Nn \__suanpan_support_construct:
{
+ % TikZ绘图样式
+ \tikzset{%
+ rod/.style = {% 档杆
+ 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,
+ middle~color = framecolor!5,
+ },
+ frame/.style = {% 上下梁
+ bottom~color=framecolor!95,
+ top~color=framecolor!95,
+ middle~color = framecolor!15,
+ },
+ frameinner/.style = {% 内边框线
+ draw=framecolor,
+ line~width=\l__suanpan_frame_inner_linewidth_dim,
+ },
+ frameouter/.style = {% 外边框线
+ draw=framecolor,
+ line~width=\l__suanpan_frame_outer_linewidth_dim,
+ },
+ }
+
\group_begin:
\hcoffin_gset:Nn \l__suanpan_support_coffin
{
- \draw_begin:
- \draw_scope_begin:
- \color_stroke:n { roddrawcolor }
- \draw_linewidth:n { \l__suanpan_rod_linewidth_dim }
- % 绘制下杆
- \draw_path_rectangle:nn { -\l__suanpan_rod_d_half_dim,
- \l__suanpan_rod_lower_offset_dim }
- { \l__suanpan_rod_d_dim,
- \l__suanpan_rod_lower_h_dim }
- % 绘制上杆
- \draw_path_rectangle:nn { -\l__suanpan_rod_d_half_dim,
- \l__suanpan_rod_upper_offset_dim }
- { \l__suanpan_rod_d_dim,
- \l__suanpan_rod_upper_h_dim }
- \color_fill:n { rodfillcolor }
- \draw_path_use_clear:n { stroke, fill }
- % 绘制横梁
- \color_stroke:n { framecolor }
- \draw_path_moveto:n { -\l__suanpan_support_d_half_dim,
- \l__suanpan_frame_b_half_dim }
- \draw_path_lineto:n { \l__suanpan_support_d_half_dim,
- \l__suanpan_frame_b_half_dim }
- \draw_path_moveto:n { -\l__suanpan_support_d_half_dim,
- -\l__suanpan_frame_b_half_dim }
- \draw_path_lineto:n { \l__suanpan_support_d_half_dim,
- -\l__suanpan_frame_b_half_dim }
- \draw_path_use_clear:n { stroke}
- \draw_scope_end:
+ \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 );
- % 绘制上下边框
- \draw_scope_begin:
- \color_stroke:n { framecolor }
- \bool_if:NT \l__suanpan_support_frame_bool
- {
- \draw_linewidth:n { \l__suanpan_frame_inner_linewidth_dim }
- % 上边框内线
- \draw_path_moveto:n { -\l__suanpan_support_d_half_dim,
- \l__suanpan_frame_upper_inner_offset_dim }
- \draw_path_lineto:n { \l__suanpan_support_d_half_dim,
- \l__suanpan_frame_upper_inner_offset_dim }
- % 下边框内线
- \draw_path_moveto:n { -\l__suanpan_support_d_half_dim,
- \l__suanpan_frame_lower_inner_offset_dim }
- \draw_path_lineto:n { \l__suanpan_support_d_half_dim,
- \l__suanpan_frame_lower_inner_offset_dim }
- \draw_path_use_clear:n { stroke}
- \draw_linewidth:n { \l__suanpan_frame_outer_linewidth_dim }
- % 上边框外线
- \draw_path_moveto:n { -\l__suanpan_support_d_half_dim,
- \l__suanpan_support_upper_dim }
- \draw_path_lineto:n { \l__suanpan_support_d_half_dim,
- \l__suanpan_support_upper_dim }
- % 下边框外线
- \draw_path_moveto:n { -\l__suanpan_support_d_half_dim,
- \l__suanpan_support_lower_dim }
- \draw_path_lineto:n { \l__suanpan_support_d_half_dim,
- \l__suanpan_support_lower_dim }
- \draw_path_use_clear:n { stroke}
- }
- \draw_scope_end:
+ % 绘制横梁
+ \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)
+ --
+ ( \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_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 );
+
% 绘制计位点(黑色圆点)
\bool_if:NT \l__suanpan_support_unit_bool
{
- \draw_scope_begin:
- \color_stroke:n { black }
- \draw_path_circle:nn { 0pt, 0pt} { \l__suanpan_frame_unit_r_dim }
- \bool_if:NTF \l__suanpan_draft_bool
- {
- \draw_path_use_clear:n { stroke }
- }{
- \color_fill:n { black }
- \draw_path_use_clear:n { stroke, fill }
- }
- \draw_scope_end:
+ \shade[%
+ inner~color=black!40,
+ outer~color=black!80,
+ ] (0pt, 0pt) circle
+ [radius = \l__suanpan_frame_unit_r_dim];
}
- \draw_end:
+ \end{tikzpicture}
}
\group_end:
}
-% 构建档杆空白容器(盒子),用于占位以避免算盘总成尺寸错误
-\cs_new:Nn \__suanpan_empty_support_construct:
- {
- % 测量档杆容器(盒子)总宽度和高度
- \dim_set:Nn \l_tmpa_dim
- { \coffin_wd:N \l__suanpan_support_coffin }
- \dim_set:Nn \l_tmpb_dim
- { \__suanpan_coffin_ht_plus_dp:N \l__suanpan_support_coffin }
-
- % 创建一个空容器(盒子)
- \hcoffin_set:Nn \l__suanpan_empty_support_coffin
- {
- \phantom{a}
- }
-
- % 调整为档杆宽度和高度
- \coffin_resize:Nnn \l__suanpan_empty_support_coffin
- { \l_tmpa_dim } { \l_tmpb_dim }
- }
-
% 绘制算珠
% #1: 算珠位置编号
% o o o o o o o | o o o
@@ -606,7 +707,7 @@
% 其中,11是悬珠位置
% #2: 算珠类型
% 0——外珠,1——内珠,2——浮珠
-\cs_new:Npn \__suanpan_dispose_bid:nn #1#2
+\cs_new:Npn \__suanpan_bid_layout:nn #1#2
{
% 算珠垂直偏移
\int_compare:nNnTF { #1 } > { 7 }
@@ -639,7 +740,7 @@
\draw_scope_end:
}
% 函数变体
-\cs_generate_variant:Nn \__suanpan_dispose_bid:nn {xx}
+\cs_generate_variant:Nn \__suanpan_bid_layout:nn {xx}
% 组装一个档位
% #1: 档位编号(基于1,从左向右计数)
@@ -646,11 +747,7 @@
% #2: 档位数字
\cs_new:Npn \__suanpan_assemble_rod:nn #1#2
{
- % 取得档位数字对应算珠位置及内珠/外珠编号
- \prop_get:NnN \l__suanpan_rods_val_prop { #2 } \l_tmpa_tl
- \clist_clear:N \l__suanpan_bids_pos_clist
- \clist_set:NV \l__suanpan_bids_pos_clist \l_tmpa_tl
-
+ \tl_set:Nn \l_tmpb_tl { #2 }
% 绘制
\draw_scope_begin:
% 水平方向偏移
@@ -661,11 +758,36 @@
{ hc } { vc } { 0pt, -\l__suanpan_support_y_offset_dim }
% 算珠
- \clist_map_inline:Nn \l__suanpan_bids_pos_clist
+ \int_compare:nNnTF { #2 } = { 0 }
{
- \clist_set:Nn \l_tmpa_clist { ##1 }
- \__suanpan_dispose_bid:xx { \clist_item:Nn \l_tmpa_clist { 1 } }
- { \clist_item:Nn \l_tmpa_clist { 2 } }
+ % 判断0值算珠是否需要绘制
+ \bool_if:NT \l__suanpan_empty_rod_bool
+ {
+ % 取得档位数字对应算珠位置及内珠/外珠编号
+ \prop_get:NnN \l__suanpan_rods_val_prop { #2 } \l_tmpa_tl
+ \clist_clear:N \l__suanpan_bids_pos_clist
+ \clist_set:NV \l__suanpan_bids_pos_clist \l_tmpa_tl
+
+ \clist_map_inline:Nn \l__suanpan_bids_pos_clist
+ {
+ \clist_set:Nn \l_tmpa_clist { ##1 }
+ \__suanpan_bid_layout:xx { \clist_item:Nn \l_tmpa_clist { 1 } }
+ { \clist_item:Nn \l_tmpa_clist { 2 } }
+ }
+ }
+ }{
+ % 不是0值算珠,需要绘制
+ % 取得档位数字对应算珠位置及内珠/外珠编号
+ \prop_get:NnN \l__suanpan_rods_val_prop { #2 } \l_tmpa_tl
+ \clist_clear:N \l__suanpan_bids_pos_clist
+ \clist_set:NV \l__suanpan_bids_pos_clist \l_tmpa_tl
+
+ \clist_map_inline:Nn \l__suanpan_bids_pos_clist
+ {
+ \clist_set:Nn \l_tmpa_clist { ##1 }
+ \__suanpan_bid_layout:xx { \clist_item:Nn \l_tmpa_clist { 1 } }
+ { \clist_item:Nn \l_tmpa_clist { 2 } }
+ }
}
\draw_scope_end:
}
@@ -679,75 +801,214 @@
% 水平偏移
\draw_transform_xshift:n { \l__suanpan_support_d_dim * ( #1 - 1 ) }
- % 空白支杆(宽度尺寸占位)
- \draw_coffin_use:Nnnn \l__suanpan_empty_support_coffin
- { hc } { vc } { 0pt, -\l__suanpan_support_y_offset_dim }
-
% 覆盖绘制
- \__suanpan_dispose_bid:xx { #2 }{ 2 }
+ \__suanpan_bid_layout:xx { #2 }{ 2 }
\draw_scope_end:
}
-% 绘制左右边框
+% 为一个档位添加记录标记
+% #1: 档位编号(基于1,从左向右)
+% #2: 标记内容
+\cs_new:Npn \__suanpan_rod_mark:nn #1#2
+ {
+ \hcoffin_set:Nn \l_tmpa_coffin
+ {
+ \begin{tikzpicture}
+ \node at ( 0, 0 ) [font=\bfseries\Large] { #2 };
+ \end{tikzpicture}
+ }
+
+ \draw_scope_begin:
+ % 水平偏移
+ \draw_transform_xshift:n { \l__suanpan_support_d_dim * ( #1 - 1 ) }
+ \draw_coffin_use:Nnn \l_tmpa_coffin { hc } { vc }
+ \draw_scope_end:
+ }
+
+% 绘制边框
% #1 第一档编号(左)
% #2 最后一档编号(右)
-\cs_new:Npn \__suanpan_left_right_frame:nn #1#2
+\cs_new:Npn \__suanpan_frame_layout:nn #1#2
{
- % 绘制左边框
+ % TikZ绘制样式
+ \tikzset{%
+ hframe/.style ={% 上下梁
+ bottom~color=framecolor!95,
+ top~color=framecolor!95,
+ middle~color = framecolor!15,
+ draw = framecolor,
+ line~width = \l__suanpan_frame_inner_linewidth_dim,
+ },
+ vframe/.style ={% 左右梁
+ left~color=framecolor!95,
+ right~color=framecolor!95,
+ middle~color = framecolor!15,
+ draw = framecolor,
+ line~width = \l__suanpan_frame_inner_linewidth_dim,
+ },
+ 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,
+ },
+ arcline/.style ={% 转角线
+ draw = framecolor,
+ line~width = \l__suanpan_frame_inner_linewidth_dim,
+ rounded~corners = \l__suanpan_frame_inner_linewidth_dim / 2,
+ },
+ }
+
+ % 总宽度
+ \dim_set:Nn \l_tmpa_dim {
+ \fp_to_dim:n {
+ \fp_eval:n { \l__suanpan_support_d_dim * ( #2 - #1 + 1.0) }
+ }
+ }
+ % 减半档宽度
+ \dim_set:Nn \l_tmpb_dim {
+ \fp_to_dim:n {
+ \fp_eval:n { \l__suanpan_support_d_dim * ( #2 - #1 ) +
+ \l__suanpan_support_d_half_dim}
+ }
+ }
+
+ \group_begin:
+ % 上下边框基础容器(盒子)
+ \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}
+ }
+
+ % 左右边框基础容器(盒子)
+ \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}
+ }
+
+ % 横梁接头基础容器(盒子)
+ \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}
+ }
+
+ % 布置上边框
\draw_scope_begin:
- \color_stroke:n { framecolor }
- \draw_linewidth:n { \l__suanpan_frame_inner_linewidth_dim }
- \draw_transform_xshift:n { \l__suanpan_support_d_dim * (#1 - 1) }
+ \draw_transform_xshift:n { -\l__suanpan_support_d_half_dim -
+ \l__suanpan_frame_inner_linewidth_dim / 2 }
+ \draw_transform_yshift:n { \l__suanpan_frame_inner_upper_dim -
+ \l__suanpan_frame_inner_linewidth_dim }
+ \draw_coffin_use:Nnnn \l_tmpa_coffin { l } { b }
+ { -\l__suanpan_frame_b_dim, 0pt }
+ \draw_scope_end:
- % 内线
- \draw_path_moveto:n { -\l__suanpan_support_d_half_dim,
- \l__suanpan_frame_inner_upper_dim }
- \draw_path_lineto:n { -\l__suanpan_support_d_half_dim,
- \l__suanpan_frame_inner_lower_dim }
- \draw_path_use_clear:n { stroke}
+ % 布置下边框
+ \draw_scope_begin:
+ \coffin_rotate:Nn \l_tmpa_coffin { 180 }
+ \draw_transform_xshift:n { \l_tmpa_dim - \l__suanpan_support_d_half_dim +
+ \l__suanpan_frame_inner_linewidth_dim / 2 }
- % 外线
- \draw_linewidth:n { \l__suanpan_frame_outer_linewidth_dim }
- \draw_path_corner_arc:nn { \l__suanpan_frame_outer_arc_dim }
- { \l__suanpan_frame_outer_arc_dim }
- \draw_path_moveto:n { -\l__suanpan_support_d_half_dim,
- \l__suanpan_frame_outer_upper_dim }
- \draw_path_lineto:n { -\l__suanpan_frame_outer_lr_offset_dim,
- \l__suanpan_frame_outer_upper_dim }
- \draw_path_lineto:n { -\l__suanpan_frame_outer_lr_offset_dim,
- \l__suanpan_frame_outer_lower_dim }
- \draw_path_lineto:n { -\l__suanpan_support_d_half_dim,
- \l__suanpan_frame_outer_lower_dim }
- \draw_path_use_clear:n { stroke}
+ \draw_transform_yshift:n { \l__suanpan_frame_inner_lower_dim +
+ \l__suanpan_frame_inner_linewidth_dim }
+ \draw_coffin_use:Nnnn \l_tmpa_coffin { l } { b }
+ { \l__suanpan_frame_b_dim, 0pt }
\draw_scope_end:
- % 绘制右边框
+ % 布置左边框
\draw_scope_begin:
- \color_stroke:n { framecolor }
- \draw_linewidth:n { \l__suanpan_frame_inner_linewidth_dim }
- \draw_transform_xshift:n { \l__suanpan_support_d_dim * (#2 - 1) }
+ \draw_transform_xshift:n { -\l__suanpan_support_d_half_dim -
+ \l__suanpan_frame_b_dim -
+ \l__suanpan_frame_inner_linewidth_dim * 1.5 }
+ \draw_transform_yshift:n { \l__suanpan_frame_inner_lower_dim -
+ \l__suanpan_frame_inner_linewidth_dim }
- % 内线
- \draw_path_moveto:n { \l__suanpan_support_d_half_dim,
- \l__suanpan_frame_inner_upper_dim }
- \draw_path_lineto:n { \l__suanpan_support_d_half_dim,
- \l__suanpan_frame_inner_lower_dim }
- \draw_path_use_clear:n { stroke}
+ \draw_coffin_use:Nnnn \l_tmpb_coffin { l } { b }
+ { 0pt, -\l__suanpan_frame_b_dim }
+ \draw_scope_end:
- % 外线
- \draw_linewidth:n { \l__suanpan_frame_outer_linewidth_dim }
- \draw_path_corner_arc:nn { \l__suanpan_frame_outer_arc_dim }
- { \l__suanpan_frame_outer_arc_dim }
- \draw_path_moveto:n { \l__suanpan_support_d_half_dim,
- \l__suanpan_frame_outer_upper_dim }
- \draw_path_lineto:n { \l__suanpan_frame_outer_lr_offset_dim,
- \l__suanpan_frame_outer_upper_dim }
- \draw_path_lineto:n { \l__suanpan_frame_outer_lr_offset_dim,
- \l__suanpan_frame_outer_lower_dim }
- \draw_path_lineto:n { \l__suanpan_support_d_half_dim,
- \l__suanpan_frame_outer_lower_dim }
- \draw_path_use_clear:n { stroke}
+ % 布置右边框
+ \draw_scope_begin:
+ \coffin_rotate:Nn \l_tmpb_coffin { 180 }
+ \draw_transform_xshift:n { \l_tmpb_dim +
+ \l__suanpan_frame_b_dim +
+ \l__suanpan_frame_inner_linewidth_dim * 1.5}% -
+ \draw_transform_yshift:n { \l__suanpan_frame_inner_upper_dim +
+ \l__suanpan_frame_inner_linewidth_dim }
+ \draw_coffin_use:Nnnn \l_tmpb_coffin { l } { b }
+ { 0pt, \l__suanpan_frame_b_dim }
\draw_scope_end:
+
+ % 布置左横梁接头
+ \draw_scope_begin:
+ \draw_transform_xshift:n { -\l__suanpan_support_d_half_dim -
+ \l__suanpan_frame_b_dim / 3 -
+ \l__suanpan_frame_inner_linewidth_dim / 2 }
+ \draw_transform_yshift:n { -\l__suanpan_frame_b_dim / 2 -
+ \l__suanpan_frame_inner_linewidth_dim / 2 }
+ \draw_coffin_use:Nnnn \l_tmpc_coffin { l } { b } { 0pt, 0pt }
+ \draw_scope_end:
+
+ % 布置右横梁接头
+ \draw_scope_begin:
+ \coffin_rotate:Nn \l_tmpc_coffin { 180 }
+ \draw_transform_xshift:n { \l_tmpb_dim +
+ \l__suanpan_frame_b_dim / 3 +
+ \l__suanpan_frame_inner_linewidth_dim / 2 }
+ \draw_transform_yshift:n { \l__suanpan_frame_b_dim / 2 +
+ \l__suanpan_frame_inner_linewidth_dim / 2 }
+ \draw_coffin_use:Nnnn \l_tmpc_coffin { l } { b } { 0pt, 0pt }
+ \draw_scope_end:
+ \group_end:
}
% 算盘排版用户接口
@@ -767,7 +1028,6 @@
\__suanpan_inner_bid_construct:
\__suanpan_outer_bid_construct:
\__suanpan_support_construct:
- \__suanpan_empty_support_construct:
% 删除#2(!b)参数取得的环境内容中的空白
\str_set:Nn \l_tmpa_str { #2 }
@@ -783,7 +1043,6 @@
\draw_end:
}
- % TODO: 需要增加组装档位数字标记功能
\hcoffin_set:Nn \l_tmpb_coffin
{
% 将原图缩小50%
@@ -871,28 +1130,21 @@
% 指定某档上某个算珠的颜色
% #1 档位(基于1,从左向右计数)
-% #2 算珠位置(1--11,11为悬珠位置)
-% #3 算珠填充颜色(绘图颜色将添加40%的黑色)
-\NewDocumentCommand{ \bid }{ m m m }
+% #2 算珠位置列表(1--11,11为悬珠位置)
+% #3 算珠填充颜色
+% #4 算珠绘制颜色(默认为内珠绘制颜色)
+\NewDocumentCommand{ \bid }{ m m m O{innerdrawcolor} }
{
% 构造浮珠
- \__suanpan_float_bid_construct:nn { #3!60!black }{ #3 }
+ \__suanpan_float_bid_construct:nn { #4 }{ #3 }
- % 绘制浮珠
- \__suanpan_float_bid:nn { #1 }{ #2 }
+ % 构造算珠位置列表
+ \clist_set:Nn \l_tmpa_clist { #2 }
- % 如不是最后一个档位,则添加一个额外空白档杆以实现水平尺寸占位
- \int_compare:nNnT { #1 } < { \l__suanpan_rod_max_int }
+ \clist_map_inline:Nn \l_tmpa_clist
{
- \draw_scope_begin:
- % 水平偏移
- \draw_transform_xshift:n { \l__suanpan_support_d_dim *
- ( \l__suanpan_rod_max_int - 1 ) }
-
- % 空白支杆(水平尺寸占位)
- \draw_coffin_use:Nnnn \l__suanpan_empty_support_coffin
- { hc } { vc } { 0pt, -\l__suanpan_support_y_offset_dim }
- \draw_scope_end:
+ % 绘制浮珠
+ \__suanpan_float_bid:nn { #1 }{ ##1 }
}
}
@@ -900,12 +1152,9 @@
% #1 星号命令,选择内珠或外珠
% #2 档位(基于1,从左向右计数)
% #3 该档数字
-% #4 算珠填充颜色(绘图颜色将添加40%的黑色)
+% #4 算珠填充颜色(绘图颜色采用原内/外珠绘制颜色)
\NewDocumentCommand{ \bids }{ s m m m }
{
- % 构造浮珠
- \__suanpan_float_bid_construct:nn { #4!60!black }{ #4 }
-
% 取得档位数字对应算珠位置及内珠/外珠编号
\prop_get:NnN \l__suanpan_rods_val_prop { #3 } \l_tmpa_tl
\clist_clear:N \l__suanpan_bids_pos_clist
@@ -914,6 +1163,9 @@
% 星号命令,用于选择外珠着色
\IfBooleanTF{#1}
{
+ % 构造浮珠
+ \__suanpan_float_bid_construct:nn { outerdrawcolor }{ #4 }
+
\clist_map_inline:Nn \l__suanpan_bids_pos_clist
{
\clist_set:Nn \l_tmpa_clist { ##1 }
@@ -924,6 +1176,9 @@
}
}
}{
+ % 构造浮珠
+ \__suanpan_float_bid_construct:nn { innerdrawcolor }{ #4 }
+
\clist_map_inline:Nn \l__suanpan_bids_pos_clist
{
\clist_set:Nn \l_tmpa_clist { ##1 }
@@ -934,32 +1189,44 @@
}
}
}
+ }
- % 如不是最后一个档位,则添加一个额外空白档杆以实现水平尺寸占位
- \int_compare:nNnT { #1 } < { \l__suanpan_rod_max_int }
+% 左右边框
+\NewDocumentCommand{ \mkframe }{ }
+ {
+ \__suanpan_frame_layout:nn { 1 }{ \l__suanpan_rod_max_int }
+ }
+
+% 为各档添加计位标记
+% #1 起始档位(基于1,从左向右计数)
+% #2 标记列表
+\NewDocumentCommand{ \rodmark }{ O{1} m }
+ {
+ % 标记列表
+ \clist_set:Nn \l_tmpa_clist { #2 }
+
+ % 计数器
+ \int_set:Nn \l_tmpa_int { #1 }
+
+ % 遍历列表
+ \clist_map_inline:Nn \l_tmpa_clist
{
- \draw_scope_begin:
- % 水平偏移
- \draw_transform_xshift:n { \l__suanpan_support_d_dim *
- ( \l__suanpan_rod_max_int - 1 ) }
+ % 输出标记
+ \__suanpan_rod_mark:nn { \l_tmpa_int }{ ##1 }
- % 空白支杆(水平尺寸占位)
- \draw_coffin_use:Nnnn \l__suanpan_empty_support_coffin
- { hc } { vc } { 0pt, -\l__suanpan_support_y_offset_dim }
- \draw_scope_end:
+ % 调整计数器
+ \int_incr:N \l_tmpa_int
+
+ % 超出最大档位
+ \int_compare:nNnT { \l_tmpa_int } > { \l__suanpan_rod_max_int }
+ {
+ \clist_map_break:
+ }
}
}
-% 左右边框
-% #1 左边第一个档位(基于1,从左向右计数)
-% #2 右边最后一个档位(基于1,从左向右计数)
-\NewDocumentCommand{ \lrframe }{ m m }
- {
- \__suanpan_left_right_frame:nn { #1 }{ #2 }
- }
-
% 选项设置用户接口
-\NewDocumentCommand \suanpanset { m }
+\NewDocumentCommand{ \suanpanset } { m }
{
\IfNoValueF { #1}
{
More information about the tex-live-commits
mailing list.