我希望\partname
(部分)显示在内容表中。
例子:
第二部分:这是我的第二部分的标题
代替
“II 这是我的第二部分的标题”
现在,我用的是这个:
\renewcommand*{\cftpartname}{Part}
\renewcommand*{\cftpartpresnum}{\space}
\renewcommand*{\cftpartaftersnum}{:}
\renewcommand*{\cftpartaftersnumb}{\space}
但它依赖于语言,因为我手动指定了部件名称。我宁愿有根据语言自动打印部件名称的功能。
我试过:
\renewcommand*{\cftpartname}{\partname~}
但它不起作用。当我选择法语作为语言时,babel 包似乎出现错误。
MWE(由于 Babel 无法编译):
\documentclass{memoir}
\usepackage[english,francais]{babel}
\renewcommand*{\cftpartname}{\partname~}
\begin{document}
\tableofcontents
\part{Name of the part 1}
\label{part:part-1}
\chapter{Chapter 1}
\label{cha:chapter-1}
\section{Section 1}
\label{sec:section-1}
\subsection{subsection 1}
\label{sec:subsection-1}
\subsection{subsection 2}
\label{sec:subsection-2}
\section{Section 2}
\label{sec:3}
\end{document}
答案1
french
多年来一直在改变事情(我不知道从什么时候开始)具体处理\partname
。跳到答案底部查看简短版本。这实际上是长期存在的问题……(每隔几年我就会再次遇到这个问题)。
因此您需要传达版本号(检查日志)。如果您使用最新的而不是太旧的版本,选项可能PartNameFull=false
会对您有所帮助。您可以在以下位置找到其法语文档:french
此位置. 请特别检查此法语文档的第 13 和 14 页。
[我知道我的答案可能与这里的问题无关,一旦实际问题澄清,我就会删除此内容]
不完整的解释
事实上我以前也遇到过类似的问题。toc 文件将包含
\contentsline {part}{\partnumberline {I}Name of the part 1}{3}
然后在某些时候调用扩展\l@part
(使用截至今天 2017/09/23 的最新 TL2017)
\FB@partname ->\ifFBPartNameFull \csname ordinal\romannumeral \value {part}\endcsname \space \frenchpartnameord \FB@emptypart \else Partie\fi
但在此阶段,当目录排版时,部分计数器为零。因此,我们最终以\ordinal
提取\space
作为参数。但french.ldf
仅定义\ordinali
、\ordinalii
等...宏:
\SetStringLoop{ordinal#1}{%
\frenchpartfirst,\frenchpartsecond,Troisième,Quatrième,%
Cinquième,Sixième,Septième,Huitième,Neuvième,Dixième,Onzième,%
Douzième,Treizième,Quatorzième,Quinzième,Seizième,%
Dix-septième,Dix-huitième,Dix-neuvième,Vingtième}
并且从不定义\ordinal
。\ordinal
宏由类提供memoir
。
$ latexdef -c memoir ordinal
Unescaped left brace in regex is deprecated, passed through in regex; marked by <-- HERE in m/^\\\@protected\@testopt { <-- HERE ?\\.*? }? *(\\\\.*?) / at /usr/local/bin/latexdef line 391.
Unescaped left brace in regex is deprecated, passed through in regex; marked by <-- HERE in m/^\\\@testopt { <-- HERE ?(\\.*?) }?/ at /usr/local/bin/latexdef line 394.
\ordinal:
macro:#1->\begingroup \let \fnumbersep \relax \form@tnumber {#1}\let \ordstring \nthstring \ifnum \c@xsm@mctr =\@ne \else \ifcase \c@ism@mctr \or \let \ordstring \iststring \or \let \ordstring \iindstring \or \let \ordstring \iiirdstring \fi \fi \ordscript {\ordstring }\endgroup
并最终导致#1
错误\space
。
(请告诉我如何摆脱使用时出现的烦人的警告latexdef
......)
我确信我之前遇到过这种情况,但我忘记了细节。
使用
\frenchsetup{PartNameFull=false}
是解决方法,因为它避免了
\FB@partname ->\ifFBPartNameFull \csname ordinal\romannumeral \value {part}\endcsname \space \frenchpartnameord \FB@emptypart \else Partie\fi
另一种方法是在 TOC 之前进行\setcounter{part}{1}
,但这只是概念证明,因为结果当然很糟糕。
简而言之
处决和\tableofcontents
后者\l@part
将在回忆录类下展开\cftpartname
。
如果你修改\cftpartname
使用 babel \partname
,那么使用法语 babel 模块,默认情况下,它将尝试扩展为依赖于当前值的部分柜台。
但是,通常情况下,在\tableofcontents
第一个之前\part
,因此part
计数器的值为零。french.ldf
代码没有预见到part
可能为零,最终由于 memoir\ordinal
宏使用错误参数展开而引发错误。
本质上,french.ldf
默认情况下,在目录中使用会\partname
导致最好的无意义,最坏的情况是某个阶段出现 TeX 错误。它将其使用限制在分段单元本身。
(因此.toc
文件中的内容已经扩展并且正常;问题是如果文件.toc
本身试图单独使用\partname
)