是否有针对带有可选参数的命令的 LaTeX 推荐标准?

是否有针对带有可选参数的命令的 LaTeX 推荐标准?

根据 LaTeX 标准,命令的可选参数位于强制参数之前。例如:

\command[optional]{mandatory}

是否建议始终遵循此方案?是否有理由避免使用参数顺序颠倒的命令?例如:

\command{mandatory}[optional]

一个实际的例子:假设要为文章创建一个类,作者应该能够指定标题 (TITLE);页面标题的可选简短版本 (SHORT),以及标题的注释 (NOTE),类似于脚注。可以:

  1. 定义 \title[SHORT]{TITLE} 和 \titlenote{NOTE},或
  2. 定义 \title{TITLE}[NOTE] 和 \shorttitle{SHORT},

第一个符合通常的 LaTeX 命令以及 asmart 和 beamer 类;第二个在将注释与标题联系起来方面更加连贯,但似乎有点麻烦。我的问题是:应该选择哪一个?

提前感谢您的回答!

答案1

即使是标准的 latex 命令在强制参数之前或之后也会有可选参数,例如

\usepackage{zzzz}[1884/01/01]

事实是,提供的定义可选参数的简单接口\newcommand只允许您定义一个可选参数,并且它必须是第一个。

如果后面的文本有可能出现[

例如

\title{TITLE}
 [the opening remarks are in square brackets]

将把括号内的注释作为可选参数,因此需要

\title{TITLE}\relax
 [the opening remarks are in square brackets]

或类似的构造来隐藏[参数扫描器。

请注意,这对于尾随可选参数来说不是问题,因为\usepackage您不能在序言中包含自由文本。

答案2

使用 LaTeX3 和解析,可选参数基本上可以放在任何你想要的地方(用户定义的宏可能有多个),除了在特殊情况下参数被“扩展”地解析,例如使用\NewExpandableDocumentCommand和朋友时。

下面是一个示例,我们定义了一个\printStuff宏,其语法为: \printStuff[global style]{arg1}[style1][color1]{arg2}[style2][color2]。此宏打印由竖线分隔的两个参数。它适用于全局样式对两个参数 (默认值: \bfseries),然后样式1颜色1对于第一个参数,样式2颜色2第二个论点。

按照 LaTeX3 的惯例,我们将实现和用户界面分开。主要逻辑在内部函数中实现\my_print_stuff:nnnnnnn,而用户级宏\printStuff仅定义“公共接口”(包括默认值)并\my_print_stuff:nnnnnnn使用适当的参数进行调用。当然,从技术上讲,可以在\printStuff用 定义的公共宏中执行所有操作\NewDocumentCommand,但这样就失去了接口和实现分离的好处。

\documentclass[a4paper,12pt]{article}
\usepackage{lmodern}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{expl3}
\usepackage{xparse}
\usepackage[svgnames]{xcolor}

\ExplSyntaxOn

% Implementation (internal)
\cs_new:Nn \my_print_stuff:nnnnnnn
  {
    \noindent
    {
      #1 #3                          % apply global and local “style”
      #4                             % optional color switch
      #2                             % first thing to print
    }
    \nobreakspace | \nobreakspace
    {
      #1 #6                          % apply global and local “style”
      #7                             % optional color switch
      #5                             % second thing to print
    }
    \par \bigskip
  }

% Public interface (user-accessible)
\NewDocumentCommand \printStuff { O{\bfseries} m O{} o m O{} o }
  {
    \my_print_stuff:nnnnnnn
      {#1}
      {#2} {#3}
      {
        \IfValueT {#4} { \color {#4} }
      }
      {#5} {#6}
      {
        \IfValueT {#7} { \color {#7} }
      }
  }

\ExplSyntaxOff

\begin{document}
\printStuff{first arg}{second arg}%
\printStuff[\itshape]{first arg}{second arg}%
\printStuff[\mdseries]{first arg}[\slshape]%
                      {second arg}[\scshape]%
\printStuff[\mdseries]{first arg}[\slshape][DarkRed]%
                      {second arg}[\scshape][DarkBlue]%
\end{document}

在此处输入图片描述

答案3

随着字体规格和/或unicode 数学包(而这又需要使用 LuaLaTeX 或 XeLaTeX),可以将可选参数之前或之后指令中的强制参数,例如\fontspec、 、、、等。\setmainfont\setsansfont\setmonofont\setmathfont\newfontfamily\newfontface

否则,一般的 LaTeX 标准是,如果通过 定义宏\newcommand,则任何可选参数都必须带有强制性参数。

答案4

类中的分段命令(例如\chaptermemoir在必需参数之前可以有两个可选参数,例如

\section[toc-title][head-title]{body-title}

body-title在目录、页眉和正文中不使用可选参数。

当给出一个可选参数时,它将用于目录和页眉。

如果给出了两个可选参数,则toc-title用于目录和head-title页眉。

仔细阅读memoir.cls代码以了解其实现方式。

相关内容