将格式良好的 \listfiles 嵌入到文档中

将格式良好的 \listfiles 嵌入到文档中

我正在为我的大学准备一份文件,需要在文件的附录中插入一个使用过的软件包及其对应版本/日期的列表。

\listfiles一种可能性是直接复制日志的输出,然后手动格式化,然后再实际提交文档的最终版本。但这似乎很容易出错...

那么有没有办法自动包含这样的列表、表格或其他内容?

答案1

我建议的宏仅显示文档类和包的信息,因此仅显示带有扩展名.cls或的信息.sty,而丢弃其他文件。

\documentclass{article}
\usepackage{longtable,array}

\listfiles % initialize
\AtEndDocument{\printfilelist}

\ExplSyntaxOn
\NewDocumentCommand{\printfilelist}{}
 {
  \cleardoublepage
  \section*{Used ~ packages}
  \setlength{\LTleft}{0pt}
  \pagestyle{empty}
  \footnotesize
  \begin{longtable}{@{} >{\ttfamily}l >{\raggedright}p{.6\textwidth} @{}}
  \nobbz_print_filelist:
  \end{longtable}
 }

\tl_new:N \l_nobbz_filelist_body_tl

\cs_new_protected:Npn \nobbz_print_filelist:
 {
  \clist_map_inline:cn { @filelist }
   {
    \nobbz_print_fileinfo:n { ##1 }
   }
  \tl_use:N \l_nobbz_filelist_body_tl
 }

\cs_new_protected:Npn \nobbz_print_fileinfo:n #1
 {
  \regex_match:nnT { \.(sty|cls)\Z } { #1 }
   {
    \nobbz_print_pkginfo:n { #1 }
   }
 }

\cs_new_protected:Npn \nobbz_print_pkginfo:n #1
 {
  \tl_put_right:Nx \l_nobbz_filelist_body_tl
   {
    \exp_not:n { #1 }
    &
    \exp_not:v { ver@#1 }
    \exp_not:N \tabularnewline
   }
 }
\ExplSyntaxOff

\begin{document}

Some text

\end{document}

在此处输入图片描述

将文件日期与信息分离的变体:

\documentclass{article}
\usepackage{longtable,array,booktabs}

\listfiles % initialize
\AtEndDocument{\printfilelist}

\ExplSyntaxOn
\NewDocumentCommand{\printfilelist}{}
 {
  \cleardoublepage
  \section*{Used ~ packages}
  \setlength{\LTleft}{0pt}
  \footnotesize
  \begin{longtable}{@{} >{\ttfamily}l l >{\raggedright}p{.6\textwidth} @{}}
  \toprule
  \multicolumn{1}{@{}l}{\bfseries File~name} &
    \multicolumn{1}{c}{\bfseries Date} &
    \bfseries File~info
  \tabularnewline
  \midrule
  \endhead
  \bottomrule
  \endfoot
  \nobbz_print_filelist:
  \end{longtable}
 }

\tl_new:N \l_nobbz_filelist_body_tl
\tl_new:N \l_nobbz_fileinfo_tl

\cs_new_protected:Npn \nobbz_print_filelist:
 {
  \clist_map_inline:cn { @filelist }
   {
    \nobbz_print_fileinfo:n { ##1 }
   }
  \tl_use:N \l_nobbz_filelist_body_tl
 }

\cs_new_protected:Npn \nobbz_print_fileinfo:n #1
 {
  \regex_match:nnT { \.(sty|cls)\Z } { #1 }
   {
    \nobbz_print_pkginfo:n { #1 }
   }
 }

\cs_new_protected:Npn \nobbz_print_pkginfo:n #1
 {
  \tl_set_eq:Nc \l_nobbz_fileinfo_tl { ver@#1 }
  \tl_replace_all:Nnn \l_nobbz_fileinfo_tl { & } { \& }
  \tl_replace_once:Nnn \l_nobbz_fileinfo_tl { ~ } { & }
  \tl_put_right:Nx \l_nobbz_filelist_body_tl
   {
    \exp_not:n { #1 }
    &
    \exp_not:V \l_nobbz_fileinfo_tl
    \exp_not:N \tabularnewline
   }
 }
\ExplSyntaxOff

\begin{document}

Some text

\end{document}

在此处输入图片描述

答案2

另一种解决方案

\documentclass{article}
%-- just for the example
\usepackage[a4paper]{geometry}
\usepackage{tikz}
\usepackage{lipsum}
%------------------------
\newlength\mtl
\makeatletter
\newcommand{\mtlistfiles}{%
\par\noindent
%%-- for measuring
\@for\@currname:=\@filelist\do{%
\setbox0=\hbox{\@currname}%
\ifdim\wd0>\mtl\relax\mtl=\wd0\fi}%
%%-- formating list
\@for\@currname:=\@filelist\do{%
\makebox[\mtl][l]{\@currname}
     \expandafter\ifx\csname ver@\@currname\endcsname\relax
     \else\@spaces\csname ver@\@currname\endcsname\fi
     \par\noindent}}
\makeatother
\listfiles
\begin{document}
bla bla
\mtlistfiles
\end{document}

在此处输入图片描述

相关内容