在开头打印项目列表,其中每个项目都在整个文档中定义

在开头打印项目列表,其中每个项目都在整个文档中定义

我想在文档开头打印一个项目列表,其中每个项目都在整个文档中定义。

我怎样才能做到这一点?

平均能量损失

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

在此处输入图片描述

相关内容