一般的
我知道有关于“如何引用具体的标题”,但是我需要一种方法来通常引用上级部分的标题或特定级别的当前部分的标题(类似于使用引用部分计数器\thesection
)。
我的文档类是article
。
问题
我有一个树状文档,其中每个部分的标题描述了树中的一个元素。部分标题应该是相应元素的路径。
但是我不想在部分命令 ( \subsubsection{A/B1/C}
) 中指定元素的完整路径,因为当路径中的元素发生变化时,这会导致大量重构工作。
我更愿意只指定路径的叶元素(最后一个或尾部元素),而头部元素则自动从上级部分推导而来。类似于:
% How should \currentsectionname and \currentsubsectionname be defined?
\newcommand{\treesubsection}[1]{\subsection{\currentsectionname /#1}}
\newcommand{\treesubsubsection}[1]{\subsubsection{\currentsubsectionname /#1}}
\section{A}
\treesubsection{B1}
\treesubsubsection{C}
我尝试过以下解决方案这个问题但是它们似乎只有在部分主体中使用时才有效,而在标题中使用则无效:
- 该
nameref
解决方案给了我TeX capacity exceeded, sorry [input stack size=5000]
。 - 该
titleref
解决方案重复了叶标题(即导致例如A/B1/B1
而不是A/B1
)。 - 解决
zref-titleref
方案是使用“currentname”代替头部,并且复制叶子。
问题
我如何引用上级章节的标题或特定级别的当前章节的标题,类似于\thesection
、\thesubsection
、 ... ?
此外,我想使用可以为目录选择自定义章节标题的功能,就像 一样\section[custom toc title]{title}
。实际上,自定义标题应始终是叶名称。
编辑(我具体尝试过的)
名称引用
\usepackage{nameref}
\makeatletter
\newcommand*{\currentname}{\@currentlabelname}
\makeatother
\newcommand{\treesubsection}[1]{\subsection{\currentname /#1}}
\newcommand{\treesubsubsection}[1]{\subsubsection{\currentname /#1}}
标题参考
\usepackage{titleref}
\makeatletter
\newcommand*{\currentname}{\TR@currentTitle}
\makeatother
\newcommand{\treesubsection}[1]{\subsection{\currentname /#1}}
\newcommand{\treesubsubsection}[1]{\subsubsection{\currentname /#1}}
zref-titleref
\usepackage{zref-titleref}
\makeatletter
\newcommand*{\currentname}{\zref@getcurrent{title}}
% \newcommand*{\currentname}{\zref@titleref@current}
\makeatother
\newcommand{\treesubsection}[1]{\subsection{\currentname /#1}}
\newcommand{\treesubsubsection}[1]{\subsubsection{\currentname /#1}}
答案1
使用\newcommand{\currentname}{\@currentlabelname}
没有效果。它将引用或的当前值\@currentlabelname
甚至是未定义的。事实上,\@currentlabelname
必须将其存储在另一个宏的扩展步骤中后章节标题已设置,不在参数中。
请注意,的当前定义\tree...
缺少使用的可能性\treesection[short toc title]{long title}
。
\documentclass{article}
\usepackage{nameref}
\makeatletter
\newcommand{\treesection}[1]{\section{#1}
\edef\currentsectionname{\@currentlabelname}}
\newcommand{\treesubsection}[1]{\subsection{\currentsectionname/#1}\edef\currentsubsectionname{\@currentlabelname}}
\newcommand{\treesubsubsection}[1]{\subsubsection{\currentsubsectionname /#1}\edef\currentsubsubsectionname{\@currentlabelname}}
\makeatother
\begin{document}
\treesection{A}
\treesubsection{B1}
\treesubsection{B2}
\treesubsubsection{C1}
\treesection{Z}
\treesubsection{B1}
\treesubsection{B2}
\treesubsubsection{C1}
\end{document}
更新“自动”定义并tree level
声明:\current...name
xparse
\documentclass{book}
\usepackage{nameref}
\usepackage{xparse}
\setcounter{secnumdepth}{3}
\makeatletter
\NewDocumentCommand{\DefineTreeLevel}{om}{%
\expandafter\NewDocumentCommand\csname tree#2\endcsname{som}{%
\IfBooleanTF{##1}{%
\csname #2*\endcsname{##3}
}{%
\def\@@tempa@@{}%
\IfValueT{#1}{%
\def\@@tempa@@{\csname current#1name\endcsname/}
}
\IfValueTF{##2}{%
\csname #2\endcsname[##2]{\@@tempa@@##3}%
}{%
\csname #2\endcsname{\@@tempa@@##3}%
}%
\expandafter\edef\csname current#2name\endcsname{\@currentlabelname}%
}%
}%
}
\makeatother
\DefineTreeLevel{chapter}
\DefineTreeLevel[chapter]{section}
\DefineTreeLevel[section]{subsection}
\DefineTreeLevel[subsection]{subsubsection}
\begin{document}
\treechapter{Gamma}
\treesection{A1}
\treesubsection{B1}
\treesubsection{B2}
\treesubsubsection{C1}
\treesection{Z}
\treesubsection{B1}
\treesubsection{B2}
\treesubsubsection{C1}
\end{document}
更新
ToC - 相关内容和一些截图
\documentclass{article}
\usepackage{nameref}
\usepackage{xparse}
\setcounter{secnumdepth}{3}
\makeatletter
\NewDocumentCommand{\DefineTreeLevel}{om}{%
\expandafter\NewDocumentCommand\csname tree#2\endcsname{som}{%
\IfBooleanTF{##1}{%
\csname #2*\endcsname{##3}
}{%
\def\@@tempa@@{}%
\IfValueT{#1}{%
\def\@@tempa@@{\csname current#1name\endcsname/}
}
\IfValueTF{##2}{%
\csname #2\endcsname[##2]{\@@tempa@@##3}%
}{%
\csname #2\endcsname{\@@tempa@@##3}%
}%
\expandafter\edef\csname current#2name\endcsname{\@currentlabelname}%
}%
}%
}
\makeatother
\DefineTreeLevel{section}
\DefineTreeLevel[section]{subsection}
\DefineTreeLevel[subsection]{subsubsection}
\begin{document}
\tableofcontents
\treesection{A1}
\treesubsection[B1]{B1}
\treesubsection{B2}
\treesubsubsection[C1]{C1}
\treesection{Z}
\treesubsection{B1}
\treesubsection{B2}
\treesubsubsection{C1}
\end{document}
下次更新,递归\@current....
名称:
\documentclass{article}
\usepackage{nameref}
\usepackage{xparse}
\setcounter{secnumdepth}{3}
\makeatletter
\NewDocumentCommand{\DefineTreeLevel}{om}{%
\expandafter\NewDocumentCommand\csname tree#2\endcsname{som}{%
\IfBooleanTF{##1}{%
\csname #2*\endcsname{##3}%
}{%
\gdef\@@tempa@@{}%
\IfValueT{#1}{%
\def\@@tempa@@{\csname current#1name\endcsname/}
}%
\IfValueTF{##2}{%
\csname #2\endcsname[##2]{\@@tempa@@##3}%
\expandafter\edef\csname current#2name\endcsname{\@@tempa@@\@currentlabelname}%
}{%
\csname #2\endcsname{\@@tempa@@##3}%
\expandafter\edef\csname current#2name\endcsname{\@currentlabelname}%
}%
}%
}%
}
\makeatother
\DefineTreeLevel{section}
\DefineTreeLevel[section]{subsection}
\DefineTreeLevel[subsection]{subsubsection}
\begin{document}
\tableofcontents
\treesection{A1}
\treesubsection[B1]{B1}
\treesubsubsection[C1]{C1}
\treesubsection[B2]{B2}
\treesubsubsection[C2]{C2}
\treesubsubsection[C3]{C3}
\treesection{Z}
\treesubsection{B1}
\treesubsection{B2}
\treesubsubsection{C1}
\end{document}