为什么在 tkz-tab 表格中的 \vcenter 中添加 \par 会导致错误

为什么在 tkz-tab 表格中的 \vcenter 中添加 \par 会导致错误

在这个例子中,我在表格\par中的命令中遇到了问题tkz-tab

! Paragraph ended before \\tkzTabLine was complete.
<to be read again> 
                   \par 
l.27 \tkzTabLine{,\vcenter{\hsize3cm $x$ \par
                                               $f(x)$},} % <---- here
?

我需要在\tkzTabLine

\documentclass[12pt]{article}
\usepackage{tkz-tab}
\begin{document}

$\vcenter{\hsize3cm $x$ \par $f(x)$}$

\bigskip

\begin{tikzpicture}
\tkzTabInit {$x$ / 1 ,$f(x)$ /1}%
{$-5$,$-3$}
\tkzTabLine{,\vcenter{\hsize3cm $x$ \par  $f(x)$},} % <---- here 
\end{tikzpicture}

\end{document}

答案1

在编写 TeX 时,没有太多文本编辑器具有括号匹配功能来捕捉}您忘记的某个地方,因此 Knuth 构建了一些方法来检查您是否在}宏尝试获取输入文件的其余部分作为参数之前忘记了。除了 David 最喜欢的,\outer宏也可以是短的或长的。

短宏可以简单地定义如下:

\def\test#1{(#1)}

但如果你忘记了}

\test{a % missing } here

boom!}

TeX 将引发完全相同的错误:

Runaway argument?
{a 
! Paragraph ended before \test was complete.
<to be read again> 
                   \par 
l.3 

?

\test如果定义为长宏,则相同的宏调用不会引发该错误:

\long\def\test#1{(#1)}

然而 TeX 的扫描仪不会寻找方法段落分隔符,它仅寻找一个\par标记,因此 LaTeX(以及纯 TeX)为您提供了,它是定义为的\endgraf副本:\par

\let\endgraf=\par

您还可以通过使用来欺骗 TeX \csname par\endcsname,或者使用其他可以隐藏\par标记的方法。


LaTeX\newcommand默认定义了一个长宏,所以如果你这样做\newcommand\test[1]{(#1)},上面的例子就可以起作用。\tkzTabLine但是,是用定义的\newcommand*,它执行一个短的\def(也许编写该包的人有充分的理由让它变短;我没有检查)。

只是为了完整性,如果您自己定义宏并且正在使用xparse,那么您需要+修饰符来使参数变长,如下所示:

\NewDocumentCommand \test {+m} {(#1)}

答案2

Phelype 解释了为什么\par那里被禁止。但有一个更简单的解决方法。

\documentclass[12pt]{article}
\usepackage{tkz-tab,array}
\begin{document}

\begin{tikzpicture}
\tkzTabInit {$x$ / 1 ,$f(x)$ /1}%
{$-5$,$-3$}
\tkzTabLine{,\parbox{3cm}{$x$\\ $f(x)$},}
\end{tikzpicture}

\end{document}

在此处输入图片描述

相关内容