我正在为我的大学准备一份文件,需要在文件的附录中插入一个使用过的软件包及其对应版本/日期的列表。
\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}