使用 Babel 和法语在回忆录类中显示 partname

使用 Babel 和法语在回忆录类中显示 partname

我希望\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

相关内容