我在 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
如果第一列中的数字是硬编码的(1
、2
等),并且您可以自由使用 LuaLaTeX,那么可以直接设置一个 Lua 函数来扫描输入1 & John
,如果找到,则将其替换为。 (我假设和11 & John
的实例应该11 & John
21 & 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
(但不包括11
、12
或),a.1
则只需在 Lua 代码中更改即可替换1.1
tabular
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 的答案以了解处理这种情况的一种方法)。
由于\input
tex 文件中的任何内容都放在文件其余部分的上下文中,因此自动表格行号也可以用来回答这个问题。
在这种情况下,我们使用以下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}
需要先重置计数器。