如果第一列未使用宏,则不能将其用作表格的参数

如果第一列未使用宏,则不能将其用作表格的参数

我的问题比我提供的 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}

在此处输入图片描述

请注意,我使用了一种更安全的空虚测试。

相关内容