![如何将 \Roman 应用于计数器中的数学表达式?](https://linux22.com/image/447902/%E5%A6%82%E4%BD%95%E5%B0%86%20%5CRoman%20%E5%BA%94%E7%94%A8%E4%BA%8E%E8%AE%A1%E6%95%B0%E5%99%A8%E4%B8%AD%E7%9A%84%E6%95%B0%E5%AD%A6%E8%A1%A8%E8%BE%BE%E5%BC%8F%EF%BC%9F.png)
假设我想产生与如何在章节中切换数字?
但用罗马数字。所以我会
- 第一章
- 第二章
- 第三章
- 第六章
而不是该帖子中的阿拉伯语版本。
在那篇文章中,第 3+4 章是由以下代码生成的:
\def\thechapter{\arabic{chapter}+\the\numexpr\value{chapter}+1\relax}
我想知道是否有类似的方法来制作第三章和第四章。如果我这样做
\def\thechapter{\Roman{chapter}+\Roman{\the\numexpr\value{chapter}+1\relax}}
它将返回一个错误。(如果我删除 ,情况也是一样\the
。)
答案1
这个答案实际上回答了错误发生的原因以及如何修复该错误的具体问题。它没有解决链接问题中回答的问题。请参阅 egreg 的答案以了解此类解决方案,或将此处的解决方案用作链接问题中给出的解决方案的一部分。
该\Roman
命令(和类似的命令)期望一个计数器作为参数,而不是一个数字,但是您\numexpr
得到的结果是数字,因此您收到错误:
Missing number, treated as zero.
<to be read again>
\c@4
因此,如果您想使用相同的方法简单地执行此操作,则需要使用\@Roman
需要数字的内部命令。
\documentclass{book}
\makeatletter
\def\thechapter{\Roman{chapter}+\@Roman{\numexpr\value{chapter}+1\relax}}
\makeatother
\begin{document}
\setcounter{chapter}{2}
\chapter{A chapter}
\end{document}
如果您不想使用低级命令,\@Roman
您可以加载calc
包,并使用临时计数器来实现相同的效果:
\documentclass{book}
\newcounter{tmpchap}
\usepackage{calc}
\renewcommand\thechapter{\protect\setcounter{tmpchap}{\value{chapter}+1}\Roman{chapter}+\Roman{tmpchap}}
\begin{document}
\setcounter{chapter}{2}
\chapter{A chapter}
\end{document}
答案2
Alan Munn 的回答很好,但还有更好的方法。
\ExplSyntaxOn
\NewDocumentCommand{\doublechapter}{O{#2}m}
{
\renewcommand{\thechapter}
{
\int_to_Roman:n {\value{chapter}}+\int_to_Roman:n {\value{chapter}+1}
}
\chapter[#1]{#2}
\stepcounter{chapter}
\renewcommand{\thechapter}{\Roman{chapter}}
}
\ExplSyntaxOff
仍然可以做到\doublechapter[Short]{Long}
完整示例
我使用它openany
只是为了避免空白页并geometry
制作较小的图片。
\documentclass[openany]{book}
\usepackage[a6paper]{geometry}
\renewcommand{\thechapter}{\Roman{chapter}}
\ExplSyntaxOn
\NewDocumentCommand{\doublechapter}{O{#2}m}
{
\renewcommand{\thechapter}
{
\int_to_Roman:n {\value{chapter}}+\int_to_Roman:n {\value{chapter}+1}
}
\chapter[#1]{#2}
\stepcounter{chapter}
\renewcommand{\thechapter}{\Roman{chapter}}
}
\ExplSyntaxOff
\begin{document}
\chapter{Title one}
\chapter{Title two}
\doublechapter{Title for the double chapter}\label{doublechapter}
\chapter{Title five}
\ref{doublechapter}
\end{document}
答案3
看完之后这个答案,我自己找到了解决办法。
\renewcommand{\thechapter}{\Roman(chapter}+\uppercase\expandafter{\romannumeral\numexpr\value{chapter}+1\relax\relax}}
根据我的理解来解释一下,chapter
,柜台(作为参数类型),并将\Roman
计数器转换为字符串。另一方面,\numexpr ... \relax
是数字,所以我们需要\romannumeral...\relax
将其转换为字符串。这会产生小写的罗马数字,应用后\uppercase\expandafter{ ... }
会将其转换为大写。