在这个例子中,我在表格\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)}