有这个问题在目录中的章节标签前添加星号要求找到一种方法在目录中特定部分的标题前面放置星号(*)。
例如 4.58 不是一个难题,4.60 是一个难题,而 4.65 是一个非常难的问题。
Alann Munn 回复了这个解决方案https://tex.stackexchange.com/a/16341/270421但澄清的是,星号也出现在文档部分标题中(这实际上不是一个真正的问题)并且也出现在标题中的标记中:
就我个人而言,我发现它没有吸引力并希望找到解决方案来删除它。
到目前为止,我尝试通过调整以下内容来创建部分环境的副本在哪里可以找到类似 LaTeX 的 \@startsection 命令的帮助文件或文档?并通过重新定义环境定义的副本\part
。
答案1
尝试这个
\documentclass{book}
\newcommand\maybeast{}% check definable
\let\maybeast\relax
\renewcommand\thesection{\maybeast\thechapter.\arabic{section}}
\newcommand\nextonewithast{%
\addtocontents{toc}
{\def\maybeast{\global\let\maybeast\relax\string\llap{*}}}%
}
\newcommand\nextonewithtwoasts{%
\addtocontents{toc}
{\def\maybeast{\global\let\maybeast\relax\string\llap{**}}}%
}
\begin{document}
\tableofcontents
\chapter{Test}
\section{section without asterisk}
\nextonewithast
\section{section with asterisk}
\section{section without asterisk}
\section{section without asterisk}
\chapter{Test 2}
\nextonewithast
\section{section with asterisk}
\nextonewithtwoasts
\section{section with two asterisks}
\section{section without asterisk}
\nextonewithast
\section{section with asterisk}
\end{document}
答案2
您可以尝试以下代码,它不会影响章节标题或页眉中的章节编号。
\documentclass{book}
\usepackage{xpatch}
\xpatchcmd{\numberline}{#1}{\tocasts#1}{}{\PatchFailure}
\newcommand*{\tocasts}{}
\newcommand*{\nexttocasts}[1][1]{%
\addtocontents{toc}{\activatetocasts{#1}}%
}
\makeatletter
\DeclareRobustCommand*{\activatetocasts}[1]{%
\renewcommand*{\tocasts}{%
\global\let\tocasts\@empty
\makebox[0pt][r]{\@tempcnta=#1\relax\@whilenum\@tempcnta>\z@\do{%
*\advance\@tempcnta\m@ne
}}%
}%
}
\makeatother
\begin{document}
\tableofcontents
\chapter{Test}
\section{One section without asterisk}
\nexttocasts
\newpage
Empty page
\newpage
As you can see here there is not problem with the page header.
\section{One section with one asterisk}
\nexttocasts[2]
\section{One section with two asterisks}
\section{Another section without asterisk}
\newpage
\end{document}
注意:代码可能会失败,例如,如果您正在使用包或类,这会更改 的定义\numberline
。如果是这样,请使用适当的最小工作示例。
答案3
\tableofcontents
我建议一种方法,在您想要的节号前面用星号声明,以逗号分隔的列表形式。该代码仅使用旧的 LaTeX 内核“ \in@
”技术,尽管我使用了自 2019 年以来才可用的便利\expanded
工具(lualatex 除外,它更早),并且可以轻松地重新格式化它。
请注意,此界面\ActivateAsterisksFor
是一个一次性命令,每次新使用都会删除以前的数据,如果您愿意,可以配置一个累积命令。
警告:不要在其参数中插入空格;如果您需要在下一行换行,请使用%
不要在行尾创建空格。
如果您重新定义\thesection
,例如使用字母代替数字,则需要调整参数以\ActivateAsterisksFor
保持同步。
已编辑:最初我忽略了您还希望某些内容使用双星号。因此,这是原始答案,下面是编辑后的答案。
只有一个星号或没有星号的方法
\documentclass{book}
\newtoks\asteriskedsections
\newcommand\ActivateAsteriskFor{\asteriskedsections}
\let\originalnumberline\numberline
\makeatletter
\renewcommand\numberline[1]{%
\expanded{\noexpand\in@{,#1,}{,\the\asteriskedsections,}}%
\ifin@\originalnumberline{\llap{*}#1}\else\originalnumberline{#1}\fi
}
\makeatother
\begin{document}
\ActivateAsteriskFor{1.2,2.1,2.2,2.4}
\tableofcontents
\chapter{Test}
\section{section without asterisk}
\section{section with asterisk}
\section{section without asterisk}
\section{section without asterisk}
\chapter{Test 2}
\section{section with asterisk}
\section{section with asterisk}
\section{section without asterisk}
\section{section with asterisk}
\end{document}
零个、一个或两个星号的方法
\documentclass{book}
\newtoks\asteriskedsections
\newcommand\ActivateAsteriskFor{\asteriskedsections}
\newtoks\doublyasteriskedsections
\newcommand\ActivateTwoAsterisksFor{\doublyasteriskedsections}
\let\originalnumberline\numberline
\makeatletter
\renewcommand\numberline[1]{%
\expanded{\noexpand\in@{,#1,}{,\the\doublyasteriskedsections,}}%
\ifin@\originalnumberline{\llap{**}#1}\else
\expanded{\noexpand\in@{,#1,}{,\the\asteriskedsections,}}%
\ifin@\originalnumberline{\llap{*}#1}\else
\originalnumberline{#1}\fi\fi
}
\makeatother
\begin{document}
\ActivateAsteriskFor{1.2,2.1,2.4}
\ActivateTwoAsterisksFor{2.2}
\tableofcontents
\chapter{Test}
\section{section without asterisk}
\section{section with asterisk}
\section{section without asterisk}
\section{section without asterisk}
\chapter{Test 2}
\section{section with asterisk}
\section{section with asterisk}
\section{section without asterisk}
\section{section with asterisk}
\end{document}