我想使用一个条件表达式,根据章节是否包含某些章节来修改章节标题。
例子:
\ifnum \value{chaptersections}>0
\setchaptername1
\else
\setchaptername2
\fi
我试图找到一些能给我提供信息的计数器(chaptersections
),但没有成功。
有什么建议吗?
答案1
这是使用该软件包的快速解决方案cntperchap
(我非常熟悉它的作者;-))
关键是要注册应该按章节跟踪的计数器,这里是章节计数器。
然后使用\GetStoredCounterValue[chapter number]{section}
宏获取相关章节的节数。这不会打印数字本身,而是将其存储在cps@@tempstoragecounter
计数器宏中……
我应该在下一个版本的cntperchap
软件包中更改/记录这一点,可能就在接下来的几天内。
一些注释
- 该
cntperchap
包需要两次 (pdf)LaTeX 运行才能存储正确的值 - 基本上任何
LaTeX
计数器都可以通过这种方式进行跟踪,但是page
由于运出机制,计数器有点棘手。
\documentclass{book}
\usepackage{cntperchap}
\RegisterCounters{section} % Register the counters which should be watched
\makeatletter
\newcommand{\currentchaptertitle}[1]{%
\GetStoredCounterValue[#1]{section}
\ifnumgreater{\value{cps@@tempcounterstorage}}{0}{%
A chapter with \number\value{cps@@tempcounterstorage} sections
}{%
A chapter without any sections
}
}
\makeatother
\begin{document}
\chapter{\currentchaptertitle{1}}
\section{First}
\section{Second}
\chapter{\currentchaptertitle{2}}
\end{document}
答案2
下面的示例记住了文件中的节数.aux
。
- 计数器
abs@chapter
用于识别章节。因此也支持带星号或不带编号的章节。 \section
被重新定义为在文件中写入一行.aux
,这会增加当前章节的节数。还\section
支持带星号的命令。- 在下一次 LaTeX 运行中,
\GetChapterSections
返回当前章节的节数。\GetNextChapterSections
扩展为下一章的节数。
完整示例文件:
\documentclass{report}
\usepackage{auxhook}
\AddLineBeginAux{%
\string\providecommand\string\AuxChapterSection[1]{}%
}
\makeatletter
\newcommand*{\AuxChapterSection}[1]{%
\@ifundefined{AuxChapterSection@#1}{%
\expandafter\gdef\csname AuxChapterSection@#1\endcsname{1}%
}{%
\expandafter\xdef\csname AuxChapterSection@#1\endcsname{%
\the\numexpr\csname AuxChapterSection@#1\endcsname + 1\relax
}%
}%
}
\newcommand*{\WriteAuxChapterSection}{%
\if@filesw
\immediate\write\@auxout{%
\string\AuxChapterSection{\the\value{abs@chapter}}%
}%
\fi
}
\newcounter{abs@chapter}
\newcommand{\Original}{}
\let\OriginalChapter\chapter
\renewcommand*{\chapter}{%
\stepcounter{abs@chapter}%
\OriginalChapter
}
\let\OriginalSection\section
\renewcommand*{\section}{%
\WriteAuxChapterSection
\OriginalSection
}
\newcommand*{\@GetChapterSections}[1]{%
\@ifundefined{AuxChapterSection@#1}{%
0%
}{%
\csname AuxChapterSection@#1\endcsname
}%
}
\newcommand*{\GetChapterSections}{%
\expandafter\@GetChapterSections\expandafter{\the\value{abs@chapter}}%
}
\newcommand*{\GetNextChapterSections}{%
\expandafter\@GetChapterSections\expandafter
{\the\numexpr\value{abs@chapter}+1\relax}%
}
\makeatother
\begin{document}
\chapter*{Preface}
Sections: \GetChapterSections\\
Sections in next chapter: \GetNextChapterSections
\chapter{Introduction}
Sections: \GetChapterSections\\
Sections in next chapter: \GetNextChapterSections
\section{First section}
\section{Second section}
\chapter{Summary}
Sections: \GetChapterSections
\section*{Starred section}
\end{document}
\end{document}