我正在编写一个不断发展的文档,其中包含我在校外学到的某些主题的笔记。我想使用 Latex 来记录它,因为它有时可能包含数学,而且从侧面看它看起来更好。
以下是一个例子:
话题:在 Latex 中不要做什么。
标签:乳胶,
内容:我的建议是,学习如何避免在乳胶中搞砸事情。
话题:请勿使电池的+ve和-ve短路。
标签:工程
内容:千万不要这样做,因为你可能会死。
话题:换油时务必使用千斤顶
标签:汽车
内容:千万别这么做,你可能会丧命。
话题: 再次使用乳胶
标签:乳胶
内容:一些新内容,注释,关于乳胶的提示等等。
上面的部分是随机排序的,因此我计划使用部分*{Topic}。但是我想创建一个超链接的内容表来组织它们,如下所示:
汽车
- 换油时务必使用千斤顶。
乳胶
- 在 Latex 中不该做什么。
- 再次使用乳胶
工程
- 请勿使电池的 +ve 和 -ve 短路。
…等等。
在上面的例子中,我每个主题只使用了一个标签,但多个标签应该包含每个标签中列出的主题(重复内容)
所以我的问题是:
- 这在 Latex 中可行吗?
- 是否有其他方法可以按随机顺序组织不断发展的文档内容?
我有一个解决方案,就是手动创建标签作为章节,内容作为子章节,但我发现随着文档长度的增加,这种方法变得很繁琐。因此,我正在寻找一种自动化解决方案。
答案1
这是一种可能性;使用 定义三个新列表(每个标签一个)\@starttoc
;该\tags
命令负责将部分的名称包含在相应的列表中:
\documentclass{article}
\usepackage{xstring}
\usepackage[explicit]{titlesec}
\usepackage[colorlinks,linkcolor=cyan]{hyperref}
\titleformat{\section}
{\normalfont\Large\bfseries}{\thesection}{1em}{#1\gdef\sectiontitle{#1}}
\newcommand\carsname{Cars}
\newcommand\LaTeXname{\LaTeX}
\newcommand\engineeringname{Engineering}
\makeatletter
\newcommand\tableofcars{%
\section*{\carsname}\@starttoc{loc}}
\newcommand\tableofLaTeX{%
\section*{\LaTeXname}\@starttoc{lax}}
\newcommand\tableofengineering{%
\section*{\engineeringname}\@starttoc{loe}}
\newcommand\tags[1]{\phantomsection%
\@for\@tempa:=#1\do
{
\IfStrEq{\@tempa}{cars}{\addcontentsline{loc}{section}{\sectiontitle}}{}
\IfStrEq{\@tempa}{LaTeX}{\addcontentsline{lax}{section}{\sectiontitle}}{}
\IfStrEq{\@tempa}{engineering}{\addcontentsline{loe}{section}{\sectiontitle}}{}
}
}
\makeatother
\begin{document}
\tableofcars
\tableofLaTeX
\tableofengineering
\section*{What not to do in \LaTeX}
\tags{LaTeX}
My tip, learning on how not to screw up things in \LaTeX
\section*{Do not short +ve and -ve of battery}
\tags{engineering}
Never do this, as you could die.
\section*{Always use jack-stand when changing oil}
\tags{cars}
Seriously don't do this, you could kill yourself
\section*{\LaTeX\ again}
\tags{LaTeX}
Some new content, notes, tips on latex. etc. etc..
\section*{A test section with two tags}
\tags{cars,engineering}
Some test here
\end{document}
答案2
我从 Gonzalo Medina 的代码开始。我提议的编码仅使用标准.toc
文件。该命令\newtag
有两个参数。第一个是将在 toc 文件中使用的标签,不应包含逗号或括号或任何可疑的内容,第二个是将用作相应标题的标签名称table of
。可以使用任意多个标签。
要显示给定标签的条目,可以使用tableof{mytag}
。显示完所需内容后,\OpenTocFileForWriting
可以发出命令以打开 toc 文件进行写入。重要的是,必须在所有命令之后执行此操作\tableof
。通常需要运行两次 latex。
\documentclass{article}
\usepackage[colorlinks,linkcolor=blue]{hyperref}
\usepackage[explicit]{titlesec}
\titleformat{\section}
{\normalfont\Large\bfseries}{\thesection}{1em}{#1\gdef\sectiontitle{#1}}
\makeatletter
\let\savedl@section\l@section
\newcommand\newtag[2]{%
\@namedef{#1name}{#2}%
\expandafter\let\csname if@#1.\endcsname\iffalse
\@namedef{l@#1@}##1##2{%
\csname if@#1.\endcsname\savedl@section{##1}{##2}\fi
\expandafter\let\csname if@#1.\endcsname\iffalse}}
\newcommand\setflagtrue[1]{\expandafter\let\csname if@#1.\endcsname\iftrue}
\newcommand\nextentryfor@tags[1]{\@for\@tempa:=#1\do{\setflagtrue{\@tempa}}}
\newcommand\tableof[1]{%
\begingroup
\section*{\@nameuse{#1name}}%
\expandafter\let\expandafter\l@section\csname l@#1@\endcsname
\makeatletter
\InputIfFileExists {\jobname .toc}{}{}%
\endgroup}
\newcommand\tags[1]{\phantomsection
\addtocontents{toc}{\string\nextentryfor@tags\string{#1\string}}%
\addcontentsline{toc}{section}{\sectiontitle}}
% as I have learned the hard way, as soon as one does \openout
% the file is overwritten and becomes empty. This is why we have
% to extract this from the \@starttoc routine and call it only
% after having used the toc file.
\newcommand\OpenTocFileForWriting{%
\expandafter\newwrite \csname tf@toc\endcsname
\immediate \openout \csname tf@toc\endcsname \jobname .toc\relax\@nobreakfalse}
\makeatother
\newtag{cars}{Cars}
\newtag{latex}{\LaTeX}
\newtag{engineering}{Engineering}
\setcounter{tocdepth}{1}
\begin{document}
\tableof{cars}
\tableof{latex}
\tableof{engineering}
\OpenTocFileForWriting
\clearpage
\section*{What not to do in \LaTeX}
\tags{latex}
My tip, learning on how not to screw up things in \LaTeX
\section*{Do not short +ve and -ve of battery}
\tags{cars,engineering}
Never do this, as you could die.
\section*{Always use jack-stand when changing oil}
\tags{cars}
Seriously don't do this, you could kill yourself
\section*{\LaTeX\ again}
\tags{latex}
Some new content, notes, tips on latex. etc. etc..
\section*{A test section with two tags}
\tags{cars,engineering}
Some test here
\section*{A test section with three tags}
\tags{cars,engineering,latex}
Some test here
\end{document}
答案3
我的建议:每个条目一个文件,并随意包含(或输入)它们。如果每个文件都有完整的主题标题,则主文件包含章节/子章节标题。您甚至可以将所有汽车主题放在名为 cars 的目录中...
要完全发挥想象力,您可以使用例如 main.tex、cars/00-intro.tex、cars/01-battery.tex、...、cars/42-oil-change.tex、LaTeX/00-intro.tex、LaTeX/01-math-tips.tex、...、LaTeX/99-stackexchange.tex、... 使用一些字符串操作语言(可能是 Perl)来填充最小的 main.tex 骨架(或者甚至仅使用目录名称从头开始创建它,或者使用某些目录/TITLE.tex 文件来制作标题)将整个集合组装成一个排序的文档。
(是的,LaTeX 是图灵完备的,但它与我为完成此类任务所选择的编程语言相去甚远。而且我是一个不惧怕命令行的 Unix 人。)