为随机组织的内容创建有组织的内容表

为随机组织的内容创建有组织的内容表

我正在编写一个不断发展的文档,其中包含我在校外学到的某些主题的笔记。我想使用 Latex 来记录它,因为它有时可能包含数学,而且从侧面看它看起来更好。

以下是一个例子:

话题:在 Latex 中不要做什么。

标签:乳胶,

内容:我的建议是,学习如何避免在乳胶中搞砸事情。


话题:请勿使电池的+ve和-ve短路。

标签:工程

内容:千万不要这样做,因为你可能会死。


话题:换油时务必使用千斤顶

标签:汽车

内容:千万别这么做,你可能会丧命。


话题: 再次使用乳胶

标签:乳胶

内容:一些新内容,注释,关于乳胶的提示等等。

上面的部分是随机排序的,因此我计划使用部分*{Topic}。但是我想创建一个超链接的内容表来组织它们,如下所示:

汽车

  1. 换油时务必使用千斤顶。

乳胶

  1. 在 Latex 中不该做什么。
  2. 再次使用乳胶

工程

  1. 请勿使电池的 +ve 和 -ve 短路。

…等等。
在上面的例子中,我每个主题只使用了一个标签,但多个标签应该包含每个标签中列出的主题(重复内容)

所以我的问题是:

  1. 这在 Latex 中可行吗?
  2. 是否有其他方法可以按随机顺序组织不断发展的文档内容?

我有一个解决方案,就是手动创建标签作为章节,内容作为子章节,但我发现随着文档长度的增加,这种方法变得很繁琐。因此,我正在寻找一种自动化解决方案。

答案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 人。)

相关内容