我必须编写一些报告,在这些报告中我将为某些人分配一些操作。我想借助一些宏来简化操作的创建,并自动创建所有操作的摘要。
接下来是我想如何使用它的一个例子。当然,如果这能简化问题,它可以被改编。
\begin{document}
\section*{Actions Summary}
\tableofallactions % or \includecollection{allactions} or whatever
\section{First Adventure}
\begin{actionlist}
\action{Finn} Finn's first action
\action{Jake} Jake's first action
\end{actionlist}
\section{Second Adventure}
\begin{actionlist}
\action{Finn} Finn's second action
\action{Finn} Finn's third action
\end{actionlist}
\end{document}
以下是我期望创建的内容:
行动摘要
- 芬恩
- Finn 的第一个动作
- Finn 的第二个动作
- Finn 的第三个动作
- 杰克
- 杰克的第一个动作
1. 第一次冒险
措施:
- 芬恩
- Finn 的第一个动作
- 杰克
- 杰克的第一个动作
2. 第二次冒险
措施:
- 芬恩
- Finn 的第二个动作
- Finn 的第三个动作
我学会了如何编写命令和环境。我还阅读了有关“collect”包的内容,以总结如下示例中的操作:内容摘要 - 章节但是,我真的不知道如何处理同一个名字可能出现在许多地方并且应该在同一个项目上进行总结的事实,就像例子中的 Finn 一样。
答案1
如果你想列出操作,你需要像这样的语法
\action{Finn}{Action}
否则收集和存储文本将会更加困难。
有了这一变化,下面是一个实现。只要第一个参数保持不变,我们只需发出\item #2
;当第一个参数发生变化时,我们关闭操作itemize
发出#1
(启动时除外)并打开操作itemize
。
这两个参数也存储在aux
文件中,以便在下次运行时检索,这将构建要使用的序列\listofactions
。
角色将按照“出现顺序”列出;可以实施排序,但需要额外付费。;-)
\documentclass{article}
\usepackage{xparse,enumitem}
\ExplSyntaxOn
\NewDocumentEnvironment{actionlist}{}
{
\tl_gclear:N \g_bichon_current_character_tl
\begin{itemize}[label=\textbullet]
}
{
\end{itemize}
\end{itemize}
}
\NewDocumentCommand{\action}{mm}
{
\bichon_write:nn { #1 } { #2 }
\tl_if_eq:VnF \g_bichon_current_character_tl { #1 }
{
\tl_if_empty:NF \g_bichon_current_character_tl
{
\end{itemize}
}
\item #1
\tl_gset:Nn \g_bichon_current_character_tl { #1 }
\begin{itemize}[label=\textbullet,nosep]
}
\item #2
}
\cs_new_protected:Nn \bichon_write:nn
{
\iow_shipout:cn { @auxout } { \actionlisting{#1}{#2} }
}
\AtEndDocument
{
\cs_set_eq:NN \actionlisting \use_none:nn
}
\NewDocumentCommand{\actionlisting}{mm}
{
\seq_if_in:NnF \g_bichon_characters_seq { #1 }
{
\seq_gput_right:Nn \g_bichon_characters_seq { #1 }
\seq_new:c { g_bichon_character_ \tl_to_str:n { #1 } _seq }
}
\seq_gput_right:cn { g_bichon_character_ \tl_to_str:n { #1 } _seq } { #2 }
}
\NewDocumentCommand{\listofactions}{}
{
\section*{Actions ~ Summary}
\seq_if_empty:NF \g_bichon_characters_seq
{% do nothing if the sequence is empty
\begin{itemize}[label=\textbullet]
\seq_map_inline:Nn \g_bichon_characters_seq
{
\item ##1
\bichon_list_character_actions:n { ##1 }
}
\end{itemize}
}
}
\cs_new_protected:Nn \bichon_list_character_actions:n
{
\begin{itemize}[label=\textbullet,nosep]
\seq_map_inline:cn { g_bichon_character_ \tl_to_str:n { #1 } _seq }
{
\item ##1
}
\end{itemize}
}
\cs_generate_variant:Nn \tl_if_eq:nnF { V }
\tl_new:N \g_bichon_current_character_tl
\seq_new:N \g_bichon_characters_seq
\ExplSyntaxOff
\begin{document}
\listofactions
\section{First Adventure}
\begin{actionlist}
\action{Finn}{Finn's first action}
\action{Jake}{Jake's first action}
\end{actionlist}
\section{Second Adventure}
\begin{actionlist}
\action{Finn}{Finn's second action}
\action{Finn}{Finn's third action}
\end{actionlist}
\end{document}
答案2
此方法是将 Finn 的操作写入.Finn
文件,将 Jake 的操作写入.Jake
文件,并在操作发生时将其打印出来。这样,操作摘要可以在第二次编译时逐项列出。相比之下,在文档中,操作按其发生的顺序打印,无论所有权如何。
已编辑以修复第一次传递的编译错误。仍需要两次传递,但现在两次传递的编译均无错误。
修订的解决方案
这看起来更符合原作者的要求。可以在序言中选择缩进和级别 1 和 2(即 A 和 B)的图标。
\documentclass{article}
\usepackage{ifthen}
\def\IndentA{20pt} \def\IconA{$\bullet$}
\def\IndentB{40pt} \def\IconB{$-$}
\parskip 3pt
\def\CurrentActor{}
\def\theactor#1{\par\leftskip\IndentA\noindent\llap{\IconA~}#1\par\leftskip0pt}
\def\theaction#1{\par\leftskip\IndentB\noindent\llap{\IconB~}#1\par\leftskip0pt}
\newcommand\action[2]{%
\ifthenelse{\equal{#1}{\CurrentActor}}
{\theaction{#2}}{\def\CurrentActor{#1}\theactor{#1}\theaction{#2}}
\addtocontents {#1}{\protect\actionsline {#2}}%
}
\newcommand\writeactions{\section*{Actions Summary}}
\newcommand\actionsline[1]{\theaction{#1}}
\makeatletter\let\starttoc\@starttoc\makeatother
\newcommand\writeaction[1]{%
\theactor{#1}\IfFileExists{\jobname.#1}{}{\theaction{Please compile again}}\starttoc{#1}
}
\begin{document}
\writeactions
\writeaction{Finn}
\writeaction{Jake}
\noindent\hrulefill\par
\tableofcontents
\noindent\hrulefill\par
\section{First Adventure}
\action{Finn}{Finn's first action Finn's first action Finn's first action Finn's first action.}
\action{Jake}{Jake's first action}
\section{Second Adventure}
\action{Finn}{Finn's second action.}
\action{Finn}{Finn's third action Finn's third action Finn's third action Finn's third action Finn's third action Finn's third action.}
\end{document}
原始解决方案
\documentclass{article}
\newcommand\action[2]{%
\begin{itemize}\item[(#1)] #2\end{itemize}
\addtocontents {#1}{\protect \actionsline {#2}}%
}
\newcommand\writeactions{\section*{Actions Summary}}
\newcommand\actionsline[1]{\item #1}
\makeatletter
\newcommand\writeaction[1]{%
\begin{itemize} \item #1
\begin{itemize}
\IfFileExists{\jobname.#1}{}{\item Please Compile Again}
\@starttoc{#1}
\end{itemize}
\end{itemize}
}
\makeatother
\begin{document}
\writeactions
\writeaction{Finn}
\writeaction{Jake}
\noindent\hrulefill\par
\tableofcontents
\noindent\hrulefill\par
\section{First Adventure}
\action{Finn}{Finn's first action}
\action{Jake}{Jake's first action}
\section{Second Adventure}
\action{Finn}{Finn's second action}
\action{Finn}{Finn's third action}
\end{document}