LaTeX 中的 # 符号起什么作用?

LaTeX 中的 # 符号起什么作用?

我知道 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

上述语法也适用于\renewcommandand \providecommand(使用 LaTeX2e),并可无缝转换为\newenvironmentand 朋友。参数的使用在可选或强制之间也没有区别。

这里有些例子:

在此处输入图片描述

\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>})。为了访问参数,你可以将它们引用为#1for<opt>#2for <man>。如果你有带参数的宏,则该参数在每个级别都引用“double”。有关更多信息,请参阅##1参数中的双磅符号 ( ) 是什么意思?

在宏中使用@通常是行不通的,因为控制序列只允许包含字母(由其指定的类别代码),并且@不是字母。因此,为了创建 形式的宏\@mytitle,您需要@首先确保 是字母。如果需要额外的照顾,为什么还要经历这种麻烦?由于它需要特别的照顾,其他用户干扰它的可能性很小,甚至包之间因相同的宏名而发生冲突的可能性也很小。例如,虽然 可能是标题\titlename名称持有者宏的常见选择,但\title@n@me可能不是。

相关内容