根据 LaTeX 标准,命令的可选参数位于强制参数之前。例如:
\command[optional]{mandatory}
是否建议始终遵循此方案?是否有理由避免使用参数顺序颠倒的命令?例如:
\command{mandatory}[optional]
一个实际的例子:假设要为文章创建一个类,作者应该能够指定标题 (TITLE);页面标题的可选简短版本 (SHORT),以及标题的注释 (NOTE),类似于脚注。可以:
- 定义 \title[SHORT]{TITLE} 和 \titlenote{NOTE},或
- 定义 \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
类中的分段命令(例如\chapter
)memoir
在必需参数之前可以有两个可选参数,例如
\section[toc-title][head-title]{body-title}
body-title
在目录、页眉和正文中不使用可选参数。
当给出一个可选参数时,它将用于目录和页眉。
如果给出了两个可选参数,则toc-title
用于目录和head-title
页眉。
仔细阅读memoir.cls
代码以了解其实现方式。