我正在尝试创建一个\tbd
(待完成)宏,以便使用以下属性轻松地在章节/部分/小节/等上添加待办事项。
- 通过一个简单的宏调用来获得一个有用的待办事项列表:待办事项列表条目应该代表待办事项在文档结构中的位置(在名为“C”的章节中应该有“TBD:C”,在“C”内的“S”节中应该有“TBD:C/S”)
- 避免冗余:我不想每次都输入章节标题作为标题参数。如果我想更改标题怎么办?
- 仅在注释中显示 TBD(这似乎更优雅)
- 首选:将命令的名称保留为
\section
(和其他)(也许使用可选参数?) - 首选(但似乎不太可能):不弄乱
section
和朋友的定义 - 首选(但似乎真的很乱):将 todonote “指向” 标题
\tbd
注意:我考虑过在节内放置命令 ( \section{title\tbd}
) 来指向正确位置的可能性todonote
,但这似乎弊大于利。特别是如果我想使用标题...
就像这样(蓝色边框的东西在不同的页面上):
是否有用于此的宏/包,或者你们中有类似的实现吗?
示例使用一半(或更少)的解决方案。我能以某种方式列出章节/部分/等的当前堆栈吗?
\documentclass{book}
\usepackage{todonotes}
\newcommand\treeloc{dummy} % this should be replaced
\newcommand\tbd{\todo[caption={TBD: \treeloc}]{TBD}}
\begin{document}
\chapter{C-1}
\section{S-1}\tbd
\section{S-2}
\chapter{C-2}\tbd
\section{S-1}
\section{S-2}
\subsection{SS-1}\tbd
\section{S-3}
\listoftodos
\end{document}
并且\treeloc
应该将待办事项列表更改为包含这些内容而不是虚拟内容:
- C-1/S-1
- C-2
- C-2/S-2/SS-1
我会努力解决这个问题,但我认为这是一个很好的问题。
参考文献(我正在考虑使用):
答案1
[这不是你想要的,是吗?]
它通过解析来实现\thesubsection
,如果相应的单位不等于,则打印出一些内容0
。相关例程是\getss
和\gets
。
\documentclass{book}
\usepackage{todonotes}
\usepackage{etoolbox}
\makeatletter
\def\getss#1.#2|{\expandafter\gets#1|\ifstrequal{#2}{0}{}{/SS-#2}}
\def\gets#1.#2|{C-#1\ifstrequal{#2}{0}{}{/S-#2}}
\newcommand\treeloc{\expandafter\getss\thesubsection|}
\makeatother
\newcommand\tbd{\todo[caption={TBD: \treeloc}]{TBD}}
\begin{document}
\chapter{C-1}
\section{S-1}\tbd
\section{S-2}
\chapter{C-2}\tbd
\section{S-1}
\section{S-2}
\subsection{SS-1}\tbd
\section{S-3}
\listoftodos
\end{document}
答案2
这是更符合我的规范的解决方案:
\documentclass[openany,14pt]{book}
\usepackage[a5paper,margin=2cm,bindingoffset=0cm,marginparwidth=1.6cm,marginparsep=0.2cm]{geometry} % for demo only
\usepackage[textwidth=1.6cm]{todonotes}
\usepackage{xpatch}
\def\resetnamelevel#1{%
\ifnum#1<1\let\thischaptername\relax\fi
\ifnum#1<2\let\thissectionname\relax\fi
\ifnum#1<3\let\thissubsectionname\relax\fi
\ifnum#1<4\let\thissubsubsectionname\relax\fi
}\resetnamelevel{0}
\def\chaptername#1{\resetnamelevel{0}\def\thischaptername{#1}}
\def\sectionname#1{\resetnamelevel{1}\def\thissectionname{#1}}
\def\subsectionname#1{\resetnamelevel{2}\def\thissubsectionname{#1}}
\def\subsubsectionname#1{\resetnamelevel{3}\def\thissubsubsectionname{#1}}
\let\Chaptermark\chaptermark
\let\Sectionmark\sectionmark
\let\Subsectionmark\subsectionmark
\let\Subsubsectionmark\subsubsectionmark
\def\chaptermark#1{\chaptername{#1}\Chaptermark{#1}}
\def\sectionmark#1{\sectionname{#1}\Sectionmark{#1}}
\def\subsectionmark#1{\subsectionname{#1}\Subsectionmark{#1}}
\def\subsubsectionmark#1{\subsubsectionname{#1}\Subsubsectionmark{#1}}
\makeatletter
\newcommand\treeloc{%
\ifx\thischaptername\relax%
??\@latex@warning{\textbackslash treeloc called outside of structure}
\else
\thischaptername%
\ifx\thissectionname\relax%
\else
\ /\ \thissectionname%
\ifx\thissubsectionname\relax%
\else
\ /\ \thissubsectionname%
\ifx\thissubsubsectionname\relax%
\else
\ /\ \thissubsubsectionname%
\fi
\fi
\fi
\fi
}
\makeatother
\newcommand\tbd{%
\todo[caption={TBD: \expandafter\treeloc}]{TBD}
}
\begin{document}
TREELOC: \treeloc
\chapter{Chapter one}\tbd
TREELOC: \treeloc
\section{Section one}\tbd
TREELOC: \treeloc
\subsection{Subsection one}\tbd
TREELOC: \treeloc
\subsubsection{Subsubsection one}\tbd
TREELOC: \treeloc
\subsection{Subsection two}\tbd
TREELOC: \treeloc
%\chapter*{Not indexed chapter}\tbd
%TREELOC: \treeloc
%\chapter*{Unset chapter}\resetnamelevel{0}\tbd
%TREELOC: \treeloc
\chapter*{Manually named chapter}\chaptername{Manually named chapter}\tbd
TREELOC: \treeloc
\section*{Manually named section}\sectionname{Manually named section}\tbd
TREELOC: \treeloc
\listoftodos
\end{document}
如果没有设置章节名称,则会发出并??
显示警告。