如何在 \chapter 中使用带有可选参数的 \StrBefore

如何在 \chapter 中使用带有可选参数的 \StrBefore

我想将目录中的章节标题修剪到第一个点。

\documentclass{book}
\usepackage{xstring}

\newcommand{\chap}[1]{%
    \chapter[\StrBefore{#1}{.}]{#1}
}
\begin{document}
\chap{Some title. Very long}

Foo Bar

\end{document}

不幸的是,这不起作用 - 我在这里遗漏了什么? (Xe)LaTeX 给了我:

Chapter 1.
! Use of \@chapter doesn't match its definition.
\@ifnextchar ... \reserved@d =#1\def \reserved@a {
                                               #2}\def \reserved@b {#3}\f...
l.8 \chap{Some title. Very long}

答案1

可选参数不应\chapter包含不受保护的分配。

\documentclass{book}
\usepackage{xstring}

\newcommand{\chap}[1]{%
    \chapter[\protect\StrBefore{#1}{.}]{#1}%
}
\begin{document}
\chap{Some title. Very long}

Foo Bar

\end{document}

另外,我认为更好的是,

\documentclass{book}
\usepackage{xstring}

\newcommand{\chap}[1]{%
    \StrBefore{#1}{.}[\chapterstart]%
    \expandafter\chapter\expandafter[\chapterstart]{#1}%
}
\begin{document}
\tableofcontents
\chap{Some title. Very long}

Foo Bar

\end{document}

这两个\expandafter命令可能不是必需的,但这确保我们永远不会依赖于 的特定值\chapterstart。这样我们就不会用 弄乱辅助文件\StrBefore

相关内容