我想在文档开头打印一个项目列表,其中每个项目都在整个文档中定义。
我怎样才能做到这一点?
平均能量损失
\documentclass[11pt]{article}
\begin{document}
\totalliste
This is shown in the document : Item1, Item2 <-desired output for the totalliste command
\addtoliste{Item1}
\addtoliste{Item2}
\end{document}
答案1
转储文件中的项目.aux
,以便在下次运行开始时重新读取它们。
下面还实现了一项检查,如果列表与上次运行相比发生了变化,则会发出警告。
\documentclass{article}
\ExplSyntaxOn
\seq_new:N \g_jowe_list_seq
\seq_new:N \l__jowe_list_old_seq
\bool_new:N \l__jowe_list_differ_bool
\NewDocumentCommand{\addtoliste}{m}
{
\iow_shipout:cn { @mainaux } { \ADDTOLIST{#1} }
}
\NewDocumentCommand{\ADDTOLIST}{m}
{
\seq_gput_right:Nn \g_jowe_list_seq { #1 }
}
\NewDocumentCommand{\totalliste}{}
{
\seq_if_empty:NTF \g_jowe_list_seq
{
``The~list~is~empty''
}
{
\seq_use:Nn \g_jowe_list_seq { ,~ }
}
}
\AddToHook{enddocument/afterlastpage}
{
\seq_set_eq:NN \l__jowe_list_old_seq \g_jowe_list_seq
\seq_gclear:N \g_jowe_list_seq
}
\AddToHook{enddocument/afteraux}
{
\int_compare:nTF { \seq_count:N \l__jowe_list_old_seq != \seq_count:N \g_jowe_list_seq }
{
\typeout{***~List~changed,~rerun~LaTeX~***}
}
{
\seq_map_pairwise_function:NNN \l__jowe_list_old_seq \g_jowe_list_seq \__jowe_list_compare:nn
\bool_if:NT \l__jowe_list_differ_bool
{
\typeout{***~List~changed,~rerun~LaTeX~***}
}
}
}
\cs_new_protected:Nn \__jowe_list_compare:nn
{
\str_if_eq:nnF { #1 } { #2 }
{
\bool_set_true:N \l__jowe_list_differ_bool
}
}
\ExplSyntaxOff
\begin{document}
\totalliste
\section{Just for a divider}
Here we add some items to our list
\addtoliste{Item1}
\addtoliste{Item2}
\addtoliste{Item3}
\end{document}
如果列表与上次运行不同,您将获得
*** List changed, rerun LaTeX ***
在控制台上和日志文件中。
对于您的特殊情况,其中项目是文件名,可能带有下划线,我建议只更改上面的代码
\NewDocumentCommand{\ADDTOLIST}{m}
{
\seq_gput_right:Ne \g_jowe_list_seq { \exp_not:N \texttt { \tl_to_str:n { #1 } } }
}
然后
\addtoliste{file_name.py}
\addtoliste{Item2}
\addtoliste{Item3}
你会得到
每章列表
如果要逐章打印列表,我们必须稍微改变一下策略。
思路是一样的,但我加了一个步骤。在 begin document 处,包含所有项目的大序列被拆分成子序列,每个章节一个。章节号已与项目一起记录。
现在\totalliste
将使用相对于当前章节的子序列。
\documentclass{book}
\ExplSyntaxOn
\seq_new:N \g_jowe_list_seq
\seq_new:N \l__jowe_list_old_seq
\bool_new:N \l__jowe_list_differ_bool
\NewDocumentCommand{\addtoliste}{m}
{
\iow_shipout:ce { @mainaux } { \ADDTOLIST{\arabic{chapter}}{\exp_not:n { #1 } } }
}
\NewDocumentCommand{\ADDTOLIST}{mm}
{
\seq_gput_right:Nn \g_jowe_list_seq { \__jowe_list_item:nn { #1 } { #2 } }
}
\NewDocumentCommand{\totalliste}{}
{
\seq_if_exist:cTF { l__jowe_list_chapter_\arabic{chapter}_seq }
{
\seq_use:cn { l__jowe_list_chapter_\arabic{chapter}_seq } { ,~ }
}
{
``The~list~is~empty''
}
}
\AddToHook{begindocument/end}
{
\seq_map_inline:Nn \g_jowe_list_seq { #1 }
}
\cs_new_protected:Nn \__jowe_list_item:nn
{
\seq_if_exist:cF { l__jowe_list_chapter_#1_seq }
{% allocate the chapter sequence
\seq_new:c { l__jowe_list_chapter_#1_seq }
}
\seq_put_right:cn { l__jowe_list_chapter_#1_seq } { \texttt { \tl_to_str:n { #2 } } }
}
\AddToHook{enddocument/afterlastpage}
{
\seq_set_eq:NN \l__jowe_list_old_seq \g_jowe_list_seq
\seq_gclear:N \g_jowe_list_seq
}
\AddToHook{enddocument/afteraux}
{
\int_compare:nTF { \seq_count:N \l__jowe_list_old_seq != \seq_count:N \g_jowe_list_seq }
{
\typeout{***~List~changed,~rerun~LaTeX~***}
}
{
\seq_map_pairwise_function:NNN \l__jowe_list_old_seq \g_jowe_list_seq \__jowe_list_compare:nn
\bool_if:NT \l__jowe_list_differ_bool
{
\typeout{***~List~changed,~rerun~LaTeX~***}
}
}
}
\cs_new_protected:Nn \__jowe_list_compare:nn
{
\str_if_eq:nnF { #1 } { #2 }
{
\bool_set_true:N \l__jowe_list_differ_bool
}
}
\ExplSyntaxOff
\begin{document}
\chapter{First}
\totalliste
\section{Just for a divider}
Here we add some items to our list
\addtoliste{file_name.py}
\addtoliste{Item2}
\addtoliste{Item3}
\chapter{Second}
\totalliste
\section{Just for a divider}
No item here
\chapter{Third}
\totalliste
\section{Just for a divider}
Here we add some items to our list
\addtoliste{file_name-again.py}
\addtoliste{Item2-3}
\addtoliste{Item3-3}
\end{document}
答案2
需要编译两次。可能与将字符串附加到变量并将其显示在文档的前面?,因为这个答案很大程度上是基于我在那里的回答。
要在文档中定义之前访问文档中的信息,标准方法是在第一次编译时将信息写入辅助文件,然后在第二次编译时在文档开头读入该信息。这里采用的就是这种方法,将信息写入带有后缀的文件中.xyz
,后缀包含以下行:
\gdef \totalliste {Item1, Item2, Item3, Item4}
在以后的编纂中,这些信息被读入到文档的开头,以便在开始时提供所需的列表。
\documentclass{article}
\def\mystring{} % temp string
\def\totalliste{} % Saved in aux file
\makeatletter
\def\addtoliste#1{\ifx\empty\mystring
\g@addto@macro\mystring{#1}\else\g@addto@macro\mystring{, #1}\fi}
\makeatother
\begin{document}
\makeatletter
\@starttoc{xyz}% executes stuff in .xyz file
\makeatother
\totalliste % display the final string here
Text...
\addtoliste{Item1}
Text ...
\addtoliste{Item2}
\addtoliste{Item3}
\addtoliste{Item4}
\addtocontents{xyz}{\gdef\protect\totalliste{\mystring}}
\end{document}