我试图弄清楚\thanks
在标准 LaTeX 文章类(未指定选项)中为什么会用星号作为脚注标记。
我迷失了方向,试图追踪\@thanks
和\footnotemark
和\c@footnote
到 和article.cls
的定义和重新定义latex.ltx
。我还尝试 grepping 的所有 LaTeX 基础文件\\ast
,认为这必须在某处用于重新定义脚注标记,但我什么也没找到。
(出现这个问题是因为我想将\thanks
脚注转换为尾注以便于期刊提交,但我的问题是关于这个命令的机制。)
梅威瑟:
\documentclass{article}
\begin{document}
\title{Example}
\author{Name\thanks{Affiliation, e-mail}}
\maketitle
\end{document}
以下是我能弄清楚的:
\maketitle
中的定义article.cls
:
\newcommand\maketitle{\par
\begingroup
\renewcommand\thefootnote{\@fnsymbol\c@footnote}%
\def\@makefnmark{\rlap{\@textsuperscript{\normalfont\@thefnmark}}}%
\long\def\@makefntext##1{\parindent 1em\noindent
\hb@[email protected]{%
\hss\@textsuperscript{\normalfont\@thefnmark}}##1}%
\if@twocolumn
\ifnum \col@number=\@ne
\@maketitle
\else
\twocolumn[\@maketitle]%
\fi
\else
\newpage
\global\@topnum\z@ % Prevents figures from going at top of page.
\@maketitle
\fi
\thispagestyle{plain}\@thanks
\endgroup
\setcounter{footnote}{0}%
\global\let\thanks\relax
\global\let\maketitle\relax
\global\let\@maketitle\relax
\global\let\@thanks\@empty
\global\let\@author\@empty
\global\let\@date\@empty
\global\let\@title\@empty
\global\let\title\relax
\global\let\author\relax
\global\let\date\relax
\global\let\and\relax
}
我看到脚注标记以某种方式重新定义,并\@thanks
在最后调用。但\thanks
和\@thanks
未在此文件中定义。
以下是中\thanks
和的定义:\@thanks
latex.ltx
\def\thanks#1{\footnotemark
\protected@xdef\@thanks{\@thanks
\protect\footnotetext[\the\c@footnote]{#1}}%
}
\let\@thanks\@empty
似乎\thanks
重新定义\@thanks
为\@thanks
加上包含其参数的脚注。它似乎\thec@footnote
会产生脚注计数器的值并排版数字,而不是星号。文章类调用\@thefnmark
但\maketitle
从未将其重新定义为星号(据我所知)。
答案1
让我们看一些定义:
\thanks
之内article.cls
:\def\thanks#1{\footnotemark \protected@xdef\@thanks{\@thanks \protect\footnotetext[\the\c@footnote]{#1}}% }
此宏设置脚注标记 -
\footnotemark
。然后它添加脚注文字的\@thanks
使用\protected@xdef\@thanks{\@thanks <new footnote text>}
。\maketitle
在article.cls
:\newcommand\maketitle{\par \begingroup \renewcommand\thefootnote{\@fnsymbol\c@footnote}% \def\@makefnmark{\rlap{\@textsuperscript{\normalfont\@thefnmark}}}% \long\def\@makefntext##1{\parindent 1em\noindent \hb@[email protected]{% \hss\@textsuperscript{\normalfont\@thefnmark}}##1}% \if@twocolumn \ifnum \col@number=\@ne \@maketitle \else \twocolumn[\@maketitle]% \fi \else \newpage \global\@topnum\z@ % Prevents figures from going at top of page. \@maketitle \fi \thispagestyle{plain}\@thanks \endgroup \setcounter{footnote}{0}% \global\let\thanks\relax \global\let\maketitle\relax \global\let\@maketitle\relax \global\let\@thanks\@empty \global\let\@author\@empty \global\let\@date\@empty \global\let\@title\@empty \global\let\title\relax \global\let\author\relax \global\let\date\relax \global\let\and\relax }
在内部
\maketitle
,对脚注机制进行了一些重新定义在组内\begingroup
...\endgroup
。首先,将脚注编号更改为
\@fnsymbol
- 常规的*
,†
,‡
,§
,¶
,‖
,,(错误)序列:**
††
‡‡
\def\@fnsymbol#1{\ensuremath{\ifcase#1\or *\or \dagger\or \ddagger\or \mathsection\or \mathparagraph\or \|\or **\or \dagger\dagger \or \ddagger\ddagger \else\@ctrerr\fi}}
f
其次,对ootn
otemark
和 的设置方式进行了更新text
- 即更新了宏\@makefnmark
和\@makefntext
。这些更新(重新定义)非常小,因为它们实际上与原始定义非常相似外部用法\maketitle
(也取自latex.ltx
:% From latex.ltx \def\@makefnmark{\hbox{\@textsuperscript{\normalfont\@thefnmark}}} % From article.cls \newcommand\@makefntext[1]{% \parindent 1em% \noindent \hb@[email protected]{\hss\@makefnmark}#1}
唯一的主要区别是使用 来设置脚注标记
\rlap
。这是因为在 s 列表中\author
,您通常会用 来分隔,
,而此重新定义允许脚注标记与之重叠。第三,使用以下命令设置实际标题
\@maketitle
:\def\@maketitle{% \newpage \null \vskip 2em% \begin{center}% \let \footnote \thanks {\LARGE \@title \par}% \vskip 1.5em% {\large \lineskip .5em% \begin{tabular}[t]{c}% \@author \end{tabular}\par}% \vskip 1em% {\large \@date}% \end{center}% \par \vskip 1.5em}
标记(脚注标记)的设置
\thanks
以及收集都是\@thanks
随着的设置进行的\@author
。\maketitle
最后,在 的末尾\@thanks
调用 ,以“释放”用 收集的累积脚注文本\@author
。由于
\@thanks
全局携带内容(由于\protected@xdef
),它会在末尾\maketitle
(\begingroup
...\endgroup
范围之外)与其他宏一起被清除。
现在让我们看一个例子:
\documentclass{article}
\usepackage[paperheight=20\baselineskip]{geometry}% Just for this example
\title{Some title}
\author{Author1\thanks{Abc}, Author2\thanks{Def} and Author3\thanks{Ghi}}
\begin{document}
\maketitle
\end{document}
请注意脚注标记与之后的标点符号是如何重叠的
Author1
。随着
\usepackage{etoolbox} \makeatletter % \patchcmd{<cmd>}{<search>}{<replace>}{<success>}{<failure>} \patchcmd{\@maketitle}{\@author}{\@author\show\@thanks}{}{} \makeatother
在序言中我们可以看到输出来自内部的
.log
累积脚注文本的序列:\thanks
\@author
> \@thanks=macro: ->\protect \footnotetext [1]{Abc}\protect \footnotetext [2]{Def}\protect \footn otetext [3]{Ghi}. \@maketitle ...ular}[t]{c}\@author \show \@thanks \end {tabular}\par }\vskip... l.11 \maketitle
\maketitle
如上所述,这些都是在结束时立即设置的。