我有一份文件(文章)列出了几项任务的列表和描述。每项任务都写在一节或小节中,除了标题和描述外,还包含负责人的姓名,以纯文本形式显示在(小)节的开头。姓名可以出现在多个(小)节中,因为一个人可能有多项任务。
最终文档看起来是这样的:
1. Basics
1.1 Task A
Name: John Doe
The task is about ...
It needs to be completed by July 2012.
1.2. Task B
Name: James F.
...
2. Task C
Name: John Doe
...
等等。
在文档的开头,我想要生成一个表格(或索引),列出所涉及的人员和他们所负责的任务(即,所有出现的名称都在一个地方引用),以便有一个有组织的视图,在其中我可以看到分配给一个人的所有任务,它应该采用以下格式:
Name | Task | Section, page
John Doe | Task A | 1.1, p. 2
| Task C | 2, p. 5
James F. | Task B | 1.2, p.3
有简单的解决办法吗?
解决方案应该便于每个人轻松切换到另一项任务,从而自动重新生成索引。
我认为我不能在这里真正使用标签,因为一个名字可以出现多次。
索引,如下所示:
\subsection{Task A}
Name: John Doe \index{John Doe}
The task is about ...
It needs to be done by ...
给我一个基本结果:
Index
John Doe, 2, 5
这可能是一个很好的起点,但据我所知,更改表中索引的布局(其中还包括部分名称)很麻烦。
答案1
这是使用 LuaLaTeX 而不使用任何 LaTeX 索引的方法。主要原理是在 LaTeX 运行期间将所有需要的信息存储在 Lua 表中,并在文档末尾打印(排序后的)信息。为了获取部分名称,我使用了\sectioningtitle
lockstep 宏(谢谢!)。
\documentclass{article}
\usepackage{etoolbox}
\usepackage{filecontents}
\begin{filecontents*}{luaFunctions.lua}
--global table
names = {}
function storeItems(name, section, task, page)
--create a new name item
item = {}
item.Name = name
item.Section = section
item.Task = task
item.Page = page
--add the new name item to the table
table.insert(names, item)
end
function printTable()
--sort the table (Name order)
table.sort (names,
function (item1, item2)
return item1.Name < item2.Name
end
)
--print the latex table
tex.print(string.format("\\begin{tabular}{c|c|c|c}"))
tex.print(string.format(" Name & Section & Task & Page\\\\\\hline"))
local nameTemp = ""
for i,p in ipairs(names) do
--print the name only if it is a new one
if p.Name == nameTemp then
tex.print(string.format(" & {%s} & {%s} & {%s}\\\\",p.Section, p.Task, p.Page))
else
tex.print(string.format("{%s} & {%s} & {%s} & {%s}\\\\",p.Name, p.Section, p.Task, p.Page))
end
nameTemp = p.Name
end
tex.print(string.format("\\end{tabular}"))
end
\end{filecontents*}
% read the external lua file to declare the defined function,
% but without execute the Lua function
\directlua{dofile("luaFunctions.lua")}
% latex command to execute the lua function
\def\store#1#2#3#4{\directlua{storeItems("#1", "#2", "#3", "#4")}}
\def\printTable{\directlua{printTable()}}
% command for the references
\def\myRef#1{%
#1\store{#1}{\thesubsection}{\sectioningtitle}{\thepage}%
}
%this is used to get the current sectionname
\newcommand*{\sectioningtitle}{}
\makeatletter
\apptocmd{\@sect}{\renewcommand*{\sectioningtitle}{#8}}{}{}
\makeatother
\begin{document}
\section{ Basics}
\subsection{Task A}
Name: \myRef{John Doe}\\
The task is about ...\\
It needs to be completed by July 2012.
\subsection{Task B}
Name: \myRef{James F.}
\subsection{Task C}
Name: \myRef{John Doe}
%
\\[1cm]
\printTable
\end{document} `enter code here`
答案2
这是一个部分解决方案——我没有设法在索引中添加分区编号和“表格状”标题,但我设法创建了人员及其负责的任务的索引。
定义一个新的
\sectioningtitle
宏,开始时它是空的。修补内部
\@sect
宏,以便每次启动一个节/小节时,其参数也会成为的新含义\sectioningtitle
。定义一个新的
\taskindex
宏排版“名称:”加上它的参数(这只是为了方便);
添加一个索引条目,其参数为主项,当前含义为
\sectioningtitle
子项。(注意:在下面的 MWE 中,我假设 MakeIndex 使用标准的!
作为项/子项分隔符运行。)
\documentclass{article}
\usepackage{makeidx}
\makeindex
\usepackage[unbalanced]{idxlayout}% no page break before `article` index
\usepackage{etoolbox}
\newcommand*{\sectioningtitle}{}
\makeatletter
\apptocmd{\@sect}{\renewcommand*{\sectioningtitle}{#8}}{}{}
\makeatother
\newcommand*{\taskindex}[1]{Name: #1\index{#1!\sectioningtitle}}
\begin{document}
\section{Basics}
\subsection{Task A}
\taskindex{Doe, John}
\subsection{Task B}
\taskindex{F., James}
\section{Task C}
\taskindex{Doe, John}
\printindex
\end{document}