我想将目录中的章节标题修剪到第一个点。
\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
。