我可以使用 LaTeX 内部的函数来改变 \input{} 的部分内容吗?

我可以使用 LaTeX 内部的函数来改变 \input{} 的部分内容吗?

我在 LaTeX 文件中有一个表,名为tabular.tex包含表格环境:

\begin{tabular}{rr}
Number & Name \\
1      & John \\
2      & Mary \\
\end{tabular}

然后我将其输入到我的主文档中

\input{tabular.tex}

我能否在 LaTeX 中以某种方式更改 John 的号码,使其变为 11 而不是 1?我可以使用sed或其他流编辑器在外部进行此更改,但我想知道是否可以在 LaTeX 中执行此操作。

我问这个问题的原因是实际的表格很大,我想部分输入行,所以最后我的 LaTeX 主文档中的行将具有连续编号。

答案1

如果第一列中的数字是硬编码的(12等),并且您可以自由使用 LuaLaTeX,那么可以直接设置一个 Lua 函数来扫描输入1 & John,如果找到,则将其替换为。 (我假设和11 & John的实例应该11 & John21 & John不是进行修改。如果此假设无效,请告知。)将此函数的操作限制在//环境中也很tabular简单。tabular*tabular[xy]

在此处输入图片描述

\RequirePackage{filecontents}
\begin{filecontents*}{tabular.tex}
\begin{tabular}{rr}
Number & Name \\
\hline
1      & John \\
21     & John \\
2      & Mary \\
\end{tabular}
\end{filecontents*}

\documentclass{article}

\usepackage{luacode}
\begin{luacode*}
-- spring into action only inside a tabular environment
in_tabular = false 
function change_john ( s )
  if string.find ( s , "\\begin{tabular" ) then
    in_tabular = true
  elseif string.find ( s , "\\end{tabular" ) then
    in_tabular = false
  elseif in_tabular then
     -- '%s-' denotes '0 or more instances of whitespace'
     -- In the following code, we allow for up to three such
     -- occurrences (before and after "1", and between "&" and "John")
     return ( string.gsub ( s , "^%s-1%s-&%s-John" , "11 & John" ) )
  end
end
luatexbase.add_to_callback ( "process_input_buffer" , 
   change_john , "change_john" )
\end{luacode*}

\begin{document}
\input tabular \par
If not inside a \texttt{tabular} environment, ``\verb+1 & John+'' does \emph{not} get modified.
\end{document}

附录为了解决 OP 的评论,即“John”不相关,只有“1”相关。如果您需要更改-like 环境第一列中的所有实例1(但不包括1112或),a.1则只需在 Lua 代码中更改即可替换1.1tabular

     return ( string.gsub ( s , "^%s-1%s-&%s-John" , "11 & John" ) )

     return ( string.gsub ( s , "^%s-1%s-&" , "11 &" ) )

%s-John从搜索字符串和John替换字符串中省略。

Lua 字符串函数教程(非常简短!):^表示行的开头,%s-表示“零个或多个空格实例”。由于 Lua 函数change_john被分配给 LuaTeX 的回调,该回调在非常早期的阶段运行,因此在 TeX 本身开始执行其常规工作之前,process_input_buffer该函数会全局用string.gsub替换所有匹配的。^%s-1%s-&"11 &"

答案2

\patchcmd可以帮助:

\begin{filecontents*}{\jobname-table.tex}
\begin{tabular}{rr}
Number & Name \\
1      & John \\
2      & Mary \\
\end{tabular}
\end{filecontents*}

\documentclass{article}
\usepackage{catchfile,etoolbox}

\begin{document}

\CatchFileDef{\mytabular}{\jobname-table.tex}{}
\patchcmd{\mytabular}{1 & John}{11 & John}{}{}
\mytabular

\end{document}

filecontents*环境仅用于使示例自成一体。

在此处输入图片描述

答案3

如果我们的tabular.tex文件仅用于此乳胶的目的,我们可以自由地用宏替换编号以提取当前行计数器的值(请参阅 Mico 的答案以了解处理这种情况的一种方法)。

由于\inputtex 文件中的任何内容都放在文件其余部分的上下文中,因此自动表格行号也可以用来回答这个问题。

在这种情况下,我们使用以下tabular.tex形式:

\begin{tabular}{rr}
Number & Name \\
\tablerownum & John \\
\tablerownum & Mary \\
\end{tabular}

在主文档中,我们必须定义计数器

\documentclass{article}

\newcounter{tablerowcounter}
\newcommand{\tablerownum}{\stepcounter{tablerowcounter}\arabic{tablerowcounter}}

\begin{document}
\setcounter{tablerowcounter}{10}
\input{tabular}
\end{document}

为了处理多个表格(假设没有发生嵌套或类似情况),\input{tabulartwo}可以根据\setcounter{tablerowcounter}{1}需要先重置计数器。

相关内容