Latex 重新格式化文本结构

Latex 重新格式化文本结构

假设我有一个 abbreivations.txt 文件

&Estimated &Time of &Arrival
&North, &East, &West, &South
&Special &Weapons &And &Tactics
&W&ireless &F&idelity

和乳胶\abbrtable{abbreivations.txt}

我希望此命令生成以下包含两列的表格,相当于正则表达式

  • 第 1 列:[^&]*&(\w)[^&]*->\1
  • 第 2 列:&(\w)->\\textbf{\1}

例如,对于示例文件,它将是:

\begin{longtable}{ll}
    \textbf{ETA} & \textbf{E}stimated \textbf{T}ime of \textbf{A}rrival\\
    \textbf{NEWS} & \textbf{N}orth, \textbf{E}ast, \textbf{W}est, \textbf{S}outh\\
    \textbf{SWAT} & \textbf{S}pecial \textbf{W}eapons \textbf{A}nd \textbf{T}actics\\
    \textbf{WiFi} & \textbf{W}\textbf{i}reless \textbf{F}\textbf{i}delity
\end{longtable}

我想要一种支持扩展的方法,即

&1$、&3$、&2$ 等指定参数的顺序

&{...} 指定几个字符的序列,或者不是字母符号,即&{Wi}reless &{Fi}delity

&? 指定序列是字符仅以缩写形式出现,即&{Wi}reless &?{-}&{Fi}delity->\textbf{Wi-Fi} & \textbf{Wi}reless \textbf{Fi}delity

&+ 指定将小写字符转换为大写,即&+{Wi}reless &?{-}&+{Fi}delity->\textbf{WI-FI} & \textbf{Wi}reless \textbf{Fi}delity

我相信 PgfplotsTable 可以使用以下语法提供部分答案

\pgfplotstableset{
    columns/1/.style={string replace={[^&]*&(\w)[^&]*}{\\textbf{\1}}},
    columns/1/.style={string replace={&(\w)}{\\textbf{\1}}},
}

我相信我会更愿意使用该preproc/expr={...}命令,但不知道我需要什么样的代码。

然而我确实想要一种方法来解析它并处理我列出的扩展,然而这应该只产生两个命令\abbrprasec1{...}\abbrprasec2{...}并将获取单元格的整个字符串并将其解析为正确的格式。

我考虑过的另一种方法是使用外部 python 脚本从文件生成 latex,我可以在网上找到足够多的关于调用脚本来处理这种方法的信息,但是它的可移植性不如仅使用 latex 包的解决方案。

那么,是否有一个合理的方法可以仅使用乳胶来解决这个问题,或者我应该选择可移植性较差的 python 脚本选项?

PS 这只是我想要创建的几个结构中的一个示例,因此我想要的答案是解释如何构建解析器/转换宏,而不是针对这个特定问题的确切解决方案。

编辑:

根据“egreg”的当前回答,我相信以下代码可能有效

\newcommand{\abbr_c1}[2]{
    \IfEqCase{#1}{
        {+}{\expandafter\MakeUppercase\expandafter\textbf\expandafter{#2}}
        {-}{\expandafter\MakeLower\expandafter\textbf\expandafter{#2}}
        {?}{\expandafter\textbf\expandafter{#2}}
        {}{\expandafter\textbf\expandafter{#2}}
    }[\PackageError{abbr}{Undefined Control Sequence}{}]
}

\newcommand{\abbr_c2}[2]{
    \IfEqCase{#1}{
        {+}{\expandafter\textbf\expandafter{#2}}
        {-}{\expandafter\textbf\expandafter{#2}}
        {?}{}
        {}{\expandafter\textbf\expandafter{#2}}
    }[\PackageError{abbr}{Undefined Control Sequence}{}]
}

\pgfplotstableset{
    columns/1/.style={
        preproc cell content/.code={
            \tl_set:Nn \l_abbr_cell {#1}
            \regex_replace_all:nnN{ ([^\&]*)\&([-+?]?)\{?((?<=\{)[^\}]*(?=\})|(?<!\{)\w)\}?([^\&]*) }{ \c{abbr_c1}\cB\{\2\cE\}\cB\{\3\cE\} }\l_abbr_cell
            \tl_use:N \l_abbr_cell
        }
    },
    columns/1/.style={
        preproc cell content/.code={
            \tl_set:Nn \l_abbr_cell {#1}
            \regex_replace_all:nnN{ ([^\&]*)\&([-+?]?)\{?((?<=\{)[^\}]*(?=\})|(?<!\{)\w)\}?([^\&]*) }{ \1\c{abbr_c2}\cB\{\2\cE\}\cB\{\3\cE\}\4 }\l_abbr_cell
            \tl_use:N \l_abbr_cell
        }
    },
}

答案1

强大的救援l3regex模块!expl3

首先我们逐行读取文件;首先对每一行进行处理,分离组&<char>并丢弃其余部分,然后类似地但将其括<char>在内\textbf。然后将结果添加到最终在中传递的表主体中longtable

\begin{filecontents*}{\jobname.abv}
&Estimated &Time of &Arrival
&North, &East, &West, &South
&Special &Weapons &And &Tactics
&W&ireless &F&idelity
\end{filecontents*}

\documentclass{article}
\usepackage{longtable}
\usepackage{xparse}


\ExplSyntaxOn
\NewDocumentCommand{\abbrtable}{m}
 {
  \glenflet_abbrtable:n { #1 }
 }

\ior_new:N \g_glenflet_abbrtable_stream
\tl_new:N \l_glenflet_abbrtable_body_tl
\tl_new:N \l_glenflet_abbrtable_entry_a_tl
\tl_new:N \l_glenflet_abbrtable_entry_b_tl

\cs_new_protected:Nn \glenflet_abbrtable:n
 {
  \tl_clear:N \l_glenflet_abbrtable_body_tl
  \ior_open:Nn \g_glenflet_abbrtable_stream { #1 }
  \ior_map_inline:Nn \g_glenflet_abbrtable_stream
   {
    \glenflet_abbrtable_entry:n { ##1 }
   }
  \begin{longtable}{ll}
  Abbreviation & Meaning \\
  \hline
  \endhead
  \tl_use:N \l_glenflet_abbrtable_body_tl
  \end{longtable}
 }

\cs_new_protected:Nn \glenflet_abbrtable_entry:n
 {
  \tl_set:Nn \l_glenflet_abbrtable_entry_a_tl { #1 }
  \tl_set_eq:NN \l_glenflet_abbrtable_entry_b_tl \l_glenflet_abbrtable_entry_a_tl
  \regex_replace_all:nnN
   { \& (.) [^\&]* }
   { \1 }
   \l_glenflet_abbrtable_entry_a_tl
  \regex_replace_all:nnN
   { \& (.) ([^\&]*) }
   { \c{textbf}\cB\{\1\cE\}\2 }
   \l_glenflet_abbrtable_entry_b_tl
  \tl_put_right:Nx \l_glenflet_abbrtable_body_tl
   {
    \exp_not:N \textbf { \exp_not:V \l_glenflet_abbrtable_entry_a_tl }
    &
    \exp_not:V \l_glenflet_abbrtable_entry_b_tl
    \exp_not:N \\
   }
 }
\ExplSyntaxOff

\begin{document}

\abbrtable{\jobname.abv}

\end{document}

在此处输入图片描述

对于所请求的扩展,还需要做更多的工作,但这就是想法。

相关内容