我(一个 LaTeX 新手)正在尝试创建一个命令,我将按如下方式调用它:
$\machine{a_1}{a_2}{\vdots}{a_n}$
带有可变数量的参数,它将输出
$\begin{array}{|c|}
\hline a_1 \\ \hline
a_2 \\ \hline
\vdots \\ \hline
a_n \\ \hline
\end{array}$
每个参数占一行\machine
。
作为我第一次尝试的似乎在正确领域的事物,我能想到的最好的办法是:
\newcommand{\machine}[1]{\begin{array}{|c|}
\foreach \index in {1, ..., #1} {
\index \\
}
\end{array}}
无论如何我都无法编译它。(正如我所说,我是一个 LaTeX 新手。)
\machine{}{}{}
如何发出这样的命令?(我对任何合理的调用语法都感到满意;如果这会使事情变得更加困难,那就不必如此。)
答案1
带有tabular
或的循环array
总是很棘手 - 要么使用标记变量并将整个表存储在寄存器中token
,要么执行其他奇怪的技巧或......
...使用\prg_replicate:nn
from LaTeX 3
(更确切地说expl3
)并让循环完成。
我已经定义了\machine{}
获取一个参数,将其内容视为逗号分隔的列表,并将内容存储到变量中clist
,该变量在内部遍历\prg_replicate:nn
。
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\int_new:N\g_patrick_int%
\NewDocumentCommand{\machine}{m}{%
\clist_set:Nn \l_tmpa_clist {#1}
\int_gzero:N \g_patrick_int
\begin{array}{|c|}
\hline
\prg_replicate:nn { \clist_count:N \l_tmpa_clist } {%
\int_gincr:N \g_patrick_int
\clist_item:Nn \l_tmpa_clist { \g_patrick_int } \\
\hline
}
\end{array}
}
\ExplSyntaxOff
\begin{document}
$\machine{a_1, a_2, \vdots, a_n} \neq \machine{a_1, a_2, a_3, a_4, a_5, a_6, \vdots, a_n}$
\end{document}
简短版本
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\machine}{m}{%
\seq_set_from_clist:Nn \l_tmpa_seq {#1}
\begin{array}{|c|}
\hline
\seq_use:Nn \l_tmpa_seq {\\ \hline} %
\\ \hline
\end{array}
}
\ExplSyntaxOff
\begin{document}
$\machine{a_1, a_2, \vdots, a_n} \neq \machine{a_1, a_2, a_3, a_4, a_5, a_6, \vdots, a_n}$
\end{document}
答案2
如果你会使用 LuaLaTeX,下面的解决方法可能会让你感兴趣。(它是直接应用@topskip 的回答对于最近的查询,使用 luatex 将列表拆分为表格array
,适应单列居中环境的情况。)
代码提供了一个名为的 TeX 宏\machine
,它接受一个参数(以逗号分隔的条目列表)和一个名为的 Lua 函数machine
(注意:没有反斜杠),该函数完成大部分工作。
% !TEX TS-program = lualatex
\documentclass{article}
\usepackage{unicode-math,luacode}
%% Lua-side code: The function 'machine' does most of the work
\begin{luacode*}
function machine ( s )
s = string.gsub ( s, "," , "\\\\\\hline ")
tex.sprint("\\begin{array}{|c|}\\hline ")
tex.sprint(s , "\\\\\\hline\\end{array}")
end
\end{luacode*}
%% TeX-side code: A macro that calls the Lua function
\newcommand{\machine}[1]{\directlua{machine(\luastring{#1})}}
\begin{document}
$\machine{a_1,a_2,\vdots,a_n}$
\end{document}