IEEEtran
在使用模式中的类准备论文时,我使用conference
重载命令(供个人使用)。结果是在作者中添加了一个额外的空白行:\end
\RenewDocumentCommand
\documentclass[conference]{IEEEtran}
\usepackage{xparse}
\title{An unimportant paper}
\author{\IEEEauthorblockN{First author}
\IEEEauthorblockA{address}}
% \let\oldend\end
% \RenewDocumentCommand\end{m}{\oldend{#1}}
\begin{document}
\maketitle
-------------------------
\end{document}
取消注释这两行注释后,作者下方(和行上方---------
)会出现一个额外的空白行。它来自\crcr
显示作者时的命令。当\renewcommand
使用 代替 时,不会发生这种现象\RenewDocumentCommand
。
因此,我的问题如下: - 为什么会发生这种情况? - 虽然在这种情况下很容易解决,但是有没有办法提前知道何时会发生这种现象?
答案1
问题主要表现为tabular
,因为如果已用重新定义,则\endtabular
命令被看到得太晚了。\end
\RenewDocumentCommand
\documentclass[conference]{IEEEtran}
\usepackage{xparse}
\let\oldend\end
\RenewDocumentCommand\end{m}{\oldend{#1}}
\begin{document}
\hrule
\begin{tabular}{c}
xyz \\
uvw \\
\end{tabular}
\begin{tabular}{c}
xyz \\
uvw \\
foo \\
\oldend{tabular}
\begin{tabular}{c}
xyz \\
uvw \\
\oldend{tabular}
\hrule
\end{document}
如您所见,第二个tabular
与第一个对齐,而第三个没有额外的行。
这并不是\crcr
如你所怀疑的那样因为某些原因。
\\
结束一场争吵。现在 LaTeX 会查找是否存在
\hline
或类似的命令,并在执行过程中扩展标记。如果找到
\omit
或\noalign
,它将执行适当的操作(前者来自\multicolumn
,后者来自\hline
)。其他命令启动一个单元格。
在“其他命令”中,所有定义为的命令都停止:根据程序员的选择,它们停止对和的\protected
搜索。\omit
\noalign
因此,\end
当表格单元格已经开始时,它就会展开,从而出现一个新行。
每个用\NewDocumentCommand
、\RenewDocumentCommand
或定义的宏\DeclareDocumentCommand
都是\protected
。但那些用 定义的宏则不是\DeclareExpandableDocumentCommand
。
顺便说一句,您看到了问题,因为其运作中\maketitle
存在问题。tabular
答案2
\end
必须是可扩展的。
\documentclass[conference]{IEEEtran}
\usepackage{xparse}
\title{An unimportant paper}
\author{\IEEEauthorblockN{First author}
\IEEEauthorblockA{address}}
\let\oldend\end
\DeclareExpandableDocumentCommand\end{m}{\oldend{#1}}
\begin{document}
\maketitle
-------------------------
\end{document}
注意:你为什么不使用\AtEndDocument{...}
?
答案3
没有xparse
\let\oldend\end
\renewcommand\end{\oldend}