我知道 LaTeX 中特殊字符的大部分作用,比如\
用于大多数命令,或者$
用于打开或关闭数学氛围,但我不知道这个符号#
有什么作用,而且我在创建个性化包的命令中看到过它……下面是一个例子:
\newcommand{\mytitle}[2][]%
{\newcommand\@mytitle{#2}
\ifthenelse{\not\equal{#1}{}}
{\newcommand\@shortmytitle{#1\ \ldots}}
{\newcommand\@shortmytitle{\@mytitle}}
}
但我仍然不明白这个#
符号的作用...所以如果有人可以解释它...那么这个 \@
命令的作用是什么?
答案1
除其他事项外(很可能超出了本问题的范围),#
还用于引用参数。在一般情况下,
\newcommand{<cmd>}[<n>][<opt>]{<stuff>}
允许您使用(第一个参数,在本例中是可选的)、(第二个参数)、... (第 n 个参数)引用<n>
里面的任何参数,最多 9 个。有办法扩展这一点,但从用户体验的角度来看,强烈不建议这样做。<stuff>
#1
#2
#n
上述语法也适用于\renewcommand
and \providecommand
(使用 LaTeX2e),并可无缝转换为\newenvironment
and 朋友。参数的使用在可选或强制之间也没有区别。
这里有些例子:
\documentclass{article}
\newcommand{\cmdA}[2]{Arg 1: #1; Arg 2: #2}% \cmdA{#1}{#2}
\newcommand{\cmdB}[2][abc]{Arg 1: #1; Arg 2: #2}% \cmdB[#1]{#2}
\newenvironment{envA}[2]
{EnvA -- Arg 1: #1; Arg 2: #2}% \begin{envA}{#1}{#2}
{}% \end{envA}
\newenvironment{envB}[2][xyz]
{EnvB -- Arg 1: #1; Arg 2: #2}% \begin{envB}[#1]{#2}
{}% \end{envB}
\begin{document}
\cmdA{123}{456}
\cmdA{}{789}
\cmdB[qwe]{rty}
\cmdB{klm}
\begin{envA}{foo}{bar}
stuff
\end{envA}
\begin{envB}[foo]{baz}
stuff
\end{envB}
\begin{envB}{barz}
stuff
\end{envB}
\end{document}
对于后一个问题,请参阅以及\makeatletter
\makeatother
做什么?- 自从@
很特别。也就是说,由于您@
在宏定义中的某个地方使用(在替换文本中是可以的),所以您需要小心。为此,如果未在类或样式文件中使用,请用\makeatletter
...括起来。\makeatother
具体到你的例子:
\newcommand{\mytitle}[2][]%
{\newcommand\@mytitle{#2}
\ifthenelse{\not\equal{#1}{}}
{\newcommand\@shortmytitle{#1\ \ldots}}
{\newcommand\@shortmytitle{\@mytitle}}
}
在外面你有
\newcommand{\mytitle}[2][]%
{%<stuff
}
这将创建一个宏\mytitle
,该宏接受一个可选参数(默认情况下为空)和一个强制参数。因此,它被称为 using \mytitle[<opt>]{<man>}
(其中\mytitle{<man>}
相当于\mytitle[]{<man>}
)。为了访问参数,你可以将它们引用为#1
for<opt>
和#2
for <man>
。如果你有带参数的宏,则该参数在每个级别都引用“double”。有关更多信息,请参阅##1
参数中的双磅符号 ( ) 是什么意思?。
在宏中使用@
通常是行不通的,因为控制序列只允许包含字母(由其指定的类别代码),并且@
不是字母。因此,为了创建 形式的宏\@mytitle
,您需要@
首先确保 是字母。如果需要额外的照顾,为什么还要经历这种麻烦?由于它需要特别的照顾,其他用户干扰它的可能性很小,甚至包之间因相同的宏名而发生冲突的可能性也很小。例如,虽然 可能是标题\titlename
名称持有者宏的常见选择,但\title@n@me
可能不是。