按照这个答案,\par
应该可以正确结束 的效果\centering
。但是在以下情况下,却没有结束。为什么?
\documentclass{article}
\makeatletter
\newcommand\@mytitle{} % create macro for title
\newcommand\mytitle[1]{\renewcommand\@mytitle{#1}}
\newcommand\@myauthor{} % create macro for author
\newcommand\myauthor[1]{\renewcommand\@myauthor{#1}}
\newcommand{\articletitle}{%
\centering%
\fontsize{18bp}{18bp}\selectfont%
\@mytitle\par%
\vspace{\baselineskip}%
\fontsize{14bp}{14bp}\selectfont%
\@myauthor\par%
\fontsize{12bp}{12bp}\selectfont%
\vspace{2\baselineskip}\par}%
\makeatother
\mytitle{This is my title}
\myauthor{This is the author}
\AtBeginDocument{\articletitle}
\begin{document}
I start writing here
\end{document}
答案1
\par
做不是结束的效果\centering
,段落的结束就是 TeX 的地方用途设置的值\centering
。可以使用组来限制 的效果\centering
。分组之后,组之前的设置再次生效。
\begingroup
\centering
...
\par
\endgroup
或者{\centering ...\par}
。
答案2
...进一步阐述Heiko 的回答:
宏提供了一种匹配某些参数文本的方法 - 这包括实际的宏及其参数或“分隔符” - 吞噬它们,并用宏的替换文本替换它们 - 外部{
..内的所有内容}
。这非正式地称为扩展,其中输入流找到一些宏,并将其扩展或替换为其他内容。
就您的示例而言,\articletitle
具有以下通用形式:
\newcommand{\articletitle}{\centering <stuff>}
有了替换的概念,every\articletitle
就纯粹被\centering <stuff>
(外部{
...内的所有内容}
)替换。请注意,虽然它似乎\centering
包含在宏定义内的某个范围内,但替换文本没有这样的范围。但是,如果你定义了
\newcommand{\articletitle}{{\centering <stuff>}}
替换文本将是{\centering <stuff>}
有限范围(或组)跟随宏替换文本的位置。
因此,为了限制\centering
宏内部开关或声明(如)的范围,请确保包含必要的分组{
... }
(或类似的)。