在一个表中列出文档中某个姓名的出现情况

在一个表中列出文档中某个姓名的出现情况

我有一份文件(文章)列出了几项任务的列表和描述。每项任务都写在一节或小节中,除了标题和描述外,还包含负责人的姓名,以纯文本形式显示在(小)节的开头。姓名可以出现在多个(小)节中,因为一个人可能有多项任务。

最终文档看起来是这样的:

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 表中,并在文档末尾打印(排序后的)信息。为了获取部分名称,我使用了\sectioningtitlelockstep 宏(谢谢!)。

\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}

在此处输入图片描述

相关内容