在尝试创建一种习惯acro
列表样式带有longtable
重复标题,我开始比过去更多地处理一些 LaTeX3 代码。我习惯使用 进行修补etoolbox
,\patchcmd
但在尝试更改通过 中的一些代码创建的模板时却不知所措acro.sty
。
目标
我想更改/添加\DeclareAcroListStyle
程序中的变量,以允许在首字母缩略词内容之前和之后添加表格行,但是里面环境longtable
。例如,这将允许\endhead
插入带有的标题行以支持多页表。
最小工作示例
这个 MWE 给出了一个表格和一个示例,说明我希望代码如何运行。
\documentclass{article}
\usepackage{acro,longtable}
\DeclareAcronym{test}{short = ST, long = Some Test}
% Define a new format type
\DeclareAcroListStyle{newstyle}{table}{
table = longtable,
table-spec = ll,
before = This text is before the \texttt{\textbackslash begin\{...\}} element.,
after = \noindent This text is after the \texttt{\textbackslash end\{...\}} element.,
%%% Want to add these variables to put header into table:
% beforeinner = \hrule Acronym & Definition \\\endhead,
% afterinner = \hrule
}
\acsetup{list-style=newstyle}
\begin{document}
\noindent This is \ac{test}.
\printacronyms
\end{document}
源代码中的更改
我通过复制和修改整个文件解决了我的整体问题acro.sty
。现在,我正尝试通过补丁来完成此操作,这样我就不必复制整个样式文件。我必须编辑的部分是 1795-1837 行(以下代码中添加了 6 行,当前版本的acro
软件包是 v2.6e 2016/09/04)。
% `table' template:
\DeclareTemplateInterface {acro-list} {table} {2}
{
table : tokenlist = tabular ,
table-spec : tokenlist = lp{.7\linewidth} ,
foreign-sep : tokenlist = {~} ,
reverse : boolean = false ,
before : tokenlist = ,
after : tokenlist = ,
beforeinner : tokenlist = , %%% ADDED
afterinner : tokenlist = %%% ADDED
}
\DeclareTemplateCode {acro-list} {table} {2}
{
table = \l__acro_list_table_tl ,
table-spec = \l__acro_list_table_spec_tl ,
foreign-sep = \l__acro_foreign_sep_tl ,
reverse = \l__acro_list_reverse_long_extra_bool ,
before = \l__acro_list_before_tl ,
after = \l__acro_list_after_tl ,
beforeinner = \l__acro_list_beforeinner_tl , %%% ADDED
afterinner = \l__acro_list_afterinner_tl %%% ADDED
}
{
\AssignTemplateKeys
\acro_activate_hyperref_support:
\bool_if:NTF \l__acro_list_reverse_long_extra_bool
{
\cs_set_protected:Npn \acro_print_list_entry:nnnn ##1##2##3##4
{ ##1 & ##3 ##2 ##4 \tabularnewline }
}
{
\cs_set_protected:Npn \acro_print_list_entry:nnnn ##1##2##3##4
{ ##1 & ##2 ##3 ##4 \tabularnewline }
}
\acro_build_list_entries:Nnn \l__acro_list_entries_tl {#1} {#2}
\use:x
{
\exp_not:V \l__acro_list_before_tl
\exp_not:N \begin { \exp_not:V \l__acro_list_table_tl }
{ \exp_not:V \l__acro_list_table_spec_tl }
\exp_not:V \l__acro_list_beforeinner_tl %%% ADDED
\exp_not:V \l__acro_list_entries_tl
\exp_not:V \l__acro_list_afterinner_tl %%% ADDED
\exp_not:N \end { \exp_not:V \l__acro_list_table_tl }
\exp_not:V \l__acro_list_after_tl
}
}
好像我可以修改模板界面创建后xtemplate
的 \EditInstance
,但我还没有真正证实这一点。
我不知道是否/如何修改模板代码以任何类似的方式。
我会在评论中考虑任何更简单的方法来解决原始问题(使用将运行标题添加到longtable
样式acro
),但真正的问题是修补 LaTeX3 中的模板代码。
答案1
正如已经提到的花式表中的首字母缩略词列表,创建一个恰好与现有模板相似的新模板是完全可以接受的。事实上,考虑到xtemplate
代码的设置方式,修补以改变接口相当棘手:支持的方式概念为了发挥作用,人们必须改变各种内部结构。
从概念层面上讲,此处模板的概念是拥有一个固定的“设计器”界面来实现某些功能。可以有多个模板执行不同的任务:当然,一个问题是每个模板在需要不同模板之前可以达到什么程度。对于需要新参数的情况,要么需要新模板,要么需要让原始模板作者对其进行扩展。
虽然它没有得到官方支持,但如果你只想更改模板的代码部分,这是可行的,因为你可以在它的“内部”位置找到代码
\expandafter\patchcmd
\csname\c__xtemplate_code_root_tl acro-list/table\endcname
...
值得注意的是,这xtemplate
是实验性的,团队已经使用它来探索为文档的各个部分提供设计器界面的方法,但它不一定是“最终决定”。事实上,团队已经得出结论,一些(故意的)限制意味着xtemplate
它不是解决问题的最佳长期解决方案。代码在处理上下文相关定义方面做得很差,而且我们在这里看到没有(简单的)继承可用。因此,新的想法正在研究中,希望它们能早日出现!