背景:我正在开发一个标题页(编写我自己的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
餐桌过满的方法。