我的问题比我提供的 MWE 更复杂。但是,该示例直接指向我的问题。
我有一个宏可以做一些处理(比如\specialline
在 MWE 中)并将其传递给另一个宏,该宏负责生成其自身的行(\tableline
)。
\documentclass[12pt,a4paper]{article}
\newcounter{sum}
\newcommand{\tableline}[3]{%
\addtocounter{sum}{#3}%
#1 & #2 & #3 \\
}
\newcommand{\specialline}[1][]{%
\def\myinput{#1}%
\ifx\myinput\empty%
\def\mytext{---}%
\else%
\def\mytext{\textit{\myinput}}%
\fi%
\tableline{\mytext}{}{100} %%% this works
%\tableline{}{\mytext}{100} %%% this fails
}
\begin{document}
\begin{tabular}{ccc}
A & B & C \\
\hline
\tableline{X}{Y}{10}
\tableline{M}{L}{40}
\tableline{K}{T}{50}
\specialline
\specialline[something]
\hline
& & \thesum \\
\end{tabular}
\end{document}
如果宏\mytext
转到第一列,则一切正常。但在任何其他列中,编译都会失败。以下是日志:
! Undefined control sequence.
<argument> \mytext
l.29 \specialline
[something]
The control sequence at the end of the top line
of your error message was never \def'ed. If you have
misspelled it (e.g., `\hobx'), type `I' and the correct
spelling (e.g., `I\hbox'). Otherwise just continue,
and I'll forget about whatever was undefined.
\tableline
我实际\specialline
使用的更复杂,涉及几个其他宏以及写入临时文件。因此,复制部分代码\tableline
是\specialline
不可取的,因为维护会受到影响。
我的问题是:为什么它无法编译以及我该如何解决这个问题?
答案1
表格单元格充当组,这意味着宏\myinput
和\mytext
在行的第一个单元格中定义,并且仅存在于那里。一个可能的解决方案是替换为,\def
但\gdef
我宁愿避免使用辅助宏进行复杂的构造,并将代码直接放在的第二个参数中\tableline
。
\documentclass[12pt,a4paper]{article}
\newcounter{sum}
\newcommand{\tableline}[3]{%
\addtocounter{sum}{#3}%
#1 & #2 & #3 \\
}
\newcommand{\specialline}[1][]{%
\tableline{}{\if\relax\detokenize{#1}\relax---\else\textit{#1}\fi}{100}%
}
\begin{document}
\begin{tabular}{ccc}
A & B & C \\
\hline
\tableline{X}{Y}{10}
\tableline{M}{L}{40}
\tableline{K}{T}{50}
\specialline
\specialline[something]
\hline
& & \thesum
\end{tabular}
\end{document}
请注意,我使用了一种更安全的空虚测试。