如何修补 \DeclareTemplateCode 的结果(用于自定义 acro 列表样式)

如何修补 \DeclareTemplateCode 的结果(用于自定义 acro 列表样式)

在尝试创建一种习惯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它不是解决问题的最佳长期解决方案。代码在处理上下文相关定义方面做得很差,而且我们在这里看到没有(简单的)继承可用。因此,新的想法正在研究中,希望它们能早日出现!

相关内容