\centering 导致错误级联

\centering 导致错误级联

背景:我正在开发一个标题页(编写我自己的titlepage环境),我正在编写我自己的\thanks命令(让我能够控制脚注的发布位置)。由于不知道如何\footnote做到这一点,我决定将每个脚注的文本写入一个文件(使用 来newfile package管理 I/O),然后从该文件读取到 中tabular以格式化悬挂的脚注。

我遇到了问题(各种错误,第二个和后面的脚注的表格格式很差)。在开发 MWE 来解释这个问题时,我惊讶地发现,只需注释掉一个\centering命令就可以让它完美地工作。

为什么会\centering导致一系列错误?我该如何保留\centering并仍获得所需的功能和输出格式?

在下面的 MWE 中,我提请您注意/审查\storeTitle和,\printTitle因为我对如何将参数#1从传递\storeTitle\printTitle(以及扩展是否合适)有些怀疑。(我意识到重新定义\printTitle可能看起来很迂回。指定标题是可选的。如果您不调用\storeTitle,则\printTitle保持为空,并且那里什么也不会发生。)

\documentclass{article}
\usepackage{newfile}
\newoutputstream{mystream}% Creates file stream for footnotes for title page
\openoutputfile{\jobname.mystream}{mystream}

\newcommand{\printTitle}{}
\newcommand{\storeTitle}[1]{\renewcommand{\printTitle}{{\large#1}}}

\newcounter{ntpfootnote}
\newcommand*{\fnmark}{\textit{\textsuperscript{\alph{ntpfootnote}}}}
\newcommand{\rowForTabular}[1]{\fnmark & #1 \\}
\newcommand{\mythanks}[1]{%
    \addtocounter{ntpfootnote}{1}%  Increments footnote counter
    {\fnmark}% Prints formatted footnote mark
%   Adds to output stream a row of text to become a row of the tabular representing the footnotes
    \addtostream{mystream}{\rowForTabular{#1}}   
}

\storeTitle{Some title\mythanks{with a first footnote.} and also a second footnote.\mythanks{This is the second footnote.}}
\begin{document}

%\centering% Uncomment this line to induce failure
\printTitle
\closeoutputstream{mystream}
\bigskip

\begin{tabular}%
    {p{8pt} p{5.5in}|}%
    \input{\jobname.mystream}
\end{tabular}
\end{document}

输出(不居中,但符合要求)为: 在此处输入图片描述

如果我随后取消注释该\centering命令,我会收到一堆引用以下位置的错误\printTitle

  • 的参数\@firstoftwo有一个额外的}
  • 失控的争论?段落在\@firstoftwo完成之前就结束了。
  • 缺失\endcsname插入。
  • 的参数\@argdef有一个额外的}

答案1

您提到的“级联”错误是第一个错误造成的后果。TeX 作为一种宏扩展语言,很难从错误中恢复,因此一个错误可能会引发更多错误。

发生错误是\centering因为它重新定义了\\,它在写入文件时会扩展,而新的定义在该上下文中扩展时会中断。

要解决此问题,您可以\protect\\编写时避免其扩展:

\documentclass{article}
\usepackage{newfile}
\newoutputstream{mystream}% Creates file stream for footnotes for title page
\openoutputfile{\jobname.mystream}{mystream}

\newcommand{\printTitle}{}
\newcommand{\storeTitle}[1]{\renewcommand{\printTitle}{{\large#1}}}

\newcounter{ntpfootnote}
\newcommand*{\fnmark}{\textit{\textsuperscript{\alph{ntpfootnote}}}}
\newcommand{\rowForTabular}[1]{\fnmark & #1 \protect\\}% <- \protect here
\newcommand{\mythanks}[1]{%
    \addtocounter{ntpfootnote}{1}%  Increments footnote counter
    {\fnmark}% Prints formatted footnote mark
%   Adds to output stream a row of text to become a row of the tabular representing the footnotes
    \addtostream{mystream}{\rowForTabular{#1}}% <- Here
}

\storeTitle{Some title\mythanks{with a first footnote.} and also a second footnote.\mythanks{This is the second footnote.}}
\begin{document}

\centering% Uncomment this line to induce failure
\printTitle
\closeoutputstream{mystream}
\bigskip

\begin{tabular}%
    % {p{8pt} p{5.5in}|}%
    {p{8pt} p{\dimexpr\textwidth-8pt-4\tabcolsep}|}% <- Suggestion
    \input{\jobname.mystream}
\end{tabular}
\end{document}

命令后面还有一个额外的空格\addtostream,这会扩大脚注后面的空间。

另外,我还建议了一种避免\hbox餐桌过满的方法。

相关内容