我定义了一个新的命令,\mysec
如下所示:
\documentclass{article}
\newcommand{\mysec}[1]{\section{#1}}
\begin{document}
\mysec[Foo foo]{Bla bla bla}
\end{document}
但在 PDF 输出中,我得到:
1 [
Foo foo]Bla bla bla
如何解决这个问题呢?
顺便说一句,我更希望不使用额外的软件包来解决问题。另请注意,我不想重新定义命令\section
。
答案1
引用TeX 常见问题解答:
在使用 定义的宏中
\newcommand
,可选参数的工作方式与 的可选参数不太一样\section
。 的可选参数的默认值\section
是强制参数的值,但\newcommand
要求您事先“知道”默认值。必要的技巧是在可选参数中使用宏[...]
使用您的 MWE 加上第一个常见问题解答解决方案:
\documentclass{article}
\newcommand\mysec[2][\DefaultOpt]{%
\def\DefaultOpt{#2}%
\section[#1]{#2}%
}
\begin{document}
\tableofcontents
\mysec{Foo}
\mysec[Bla]{Bla bla bla}
\end{document}
答案2
宏\section
有几种语法形式:
\section*{title}
:星号形式抑制了目录中的编号和条目。\section[toc]{title}
:如果没有使用星号,则可以使用可选参数给出目录中的不同条目。
两个 LaTeX 内核宏有助于解析参数\section
:
\@ifstar{<star>}{<no star>}
:如果后面有星号,则调用第一个参数,否则调用第二个参数。如果看到星号,则将其从输入中删除。\@dblarg{<macro or macro with arguments>}
:宏\@dblarg
会查看下一个强制参数前面是否有可选参数,并使用两个参数调用其参数。如果有一个可选参数,则该参数放在方括号中,后面跟着强制参数。在这种情况下,\@dblarg
或多或少是无操作。但如果缺少可选参数,则\@dblarg
复制强制参数的内容并将其传递到方括号中。示例:\@dblarg{\foo}[aa]{bb} ⇒ \foo[aa]{bb} \@dblarg{\foo}{cc} ⇒ \foo[cc]{cc}
然后\mysec
可以按以下方式定义:
\documentclass{article}
\makeatletter
\newcommand*{\mysec}{%
\@ifstar{\@mysec@star}{\@mysec}%
}
\newcommand*{\@mysec}{%
\@dblarg\@mysec@nostar%
}
\newcommand*{\@mysec@star}[1]{%
\section*{#1}%
\begin{tabular}{@{}l@{ }l@{}}
Star: yes\\
Title: #1\\
\end{tabular}%
}
\def\@mysec@nostar[#1]#2{%
\section[{#1}]{#2}%
\begin{tabular}{@{}l@{ }l@{}}
Star: & no\\
Toc: \\
Title: \\
\end{tabular}%
}
\makeatother
\begin{document}
\mysec*{Introduction}
\mysec{My section}
\mysec[Foo foo]{Bla bla bla}
\end{document}
答案3
这对于xparse
包裹:
\documentclass{article}
\usepackage{xparse}
\DeclareDocumentCommand\mysec{om}
{%
\IfValueTF{#1}
{\section[#1]{#2}}
{\section{#2}}%
}
\begin{document}
\tableofcontents
\section[my section]{Here is normal section}
Some text
\section{Another normal section}
Some text
\mysec[foo bar]{this is my section}
Text
\mysec{this is my second section}
Text
\end{document}
如果您不想使用任何额外的包:
\documentclass{article}
\let\mysec\section
\begin{document}
\tableofcontents
\section[my section]{Here is normal section}
Some text
\section{Another normal section}
Some text
\mysec[foo bar]{this is my section}
Text
\mysec{this is my second section}
Text
\end{document}