行数未知的表

行数未知的表

我(一个 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:nnfrom 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}

相关内容