假设我有一个 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}
对于所请求的扩展,还需要做更多的工作,但这就是想法。