![如何输入/包含单个文件作为表的行?](https://linux22.com/image/448891/%E5%A6%82%E4%BD%95%E8%BE%93%E5%85%A5%2F%E5%8C%85%E5%90%AB%E5%8D%95%E4%B8%AA%E6%96%87%E4%BB%B6%E4%BD%9C%E4%B8%BA%E8%A1%A8%E7%9A%84%E8%A1%8C%EF%BC%9F.png)
在尝试构建多个文档的情况下,每个文档将有一个页面,其中包含使用公共数据的自己的(长)表。以下是表定义的最小示例:
\documentclass{article}
\usepackage{tabularray}
\begin{document}
\begin{longtblr}{
colspec={m{100pt}X},
rowhead=1,
width=\textwidth,
}
Key & Value \\
first & desc1 \\
second & desc2 \\
\end{longtblr}
\end{document}
我希望使用\input
命令定义表格将使用哪些行,从而允许一个文档中的表格定义使用与另一个文档不同的行集。例如:
[测试.tex]
\begin{longtblr}{
colspec={m{100pt}X},
rowhead=1,
width=\textwidth,
}
Key & Value \\
\input{test-row1}
\input{test-row2}
\end{longtblr}
[测试-行1.tex]
second & desc1 \\
但是,这种方法会产生以下错误:
! Misplaced alignment tab character &.
有没有什么办法可以让它工作?
当前的解决方法是将每列拆分为自己的包含文件,如下所示,但希望避免这种情况:
\input{test-r2c1} & \input{test-r2c2} \\
答案1
使用上面链接问题中 David Carlisle 的“可怕的黑客”,我们有(也阅读代码中的注释以了解它的作用)
%! TEX program = pdflatex
\documentclass{article}
\usepackage{tabularray}
\begin{document}
\ExplSyntaxOn
% read the file content
\file_get:nnN {test-row1} {\ExplSyntaxOff} \testrowone
\ExplSyntaxOff
\begin{longtblr}[expand=\expandafter]{
colspec={m{100pt}X},
rowhead=1,
width=\textwidth
}
Key & Value \\
first & desc1 \\
\expandafter\empty\testrowone
%\expandafter\empty\testrowtwo, etc.
\end{longtblr}
\end{document}
答案2
使用最新functional
版本 2022G(2022-05-22)和tabularray
版本 2022B(2022-06-01),可以轻松地在表格内输入文件。
有一个新的 functional
库和包evaluate
中的外部规范tabularray
。使用此库,您可以tabularray
评估指定的每次出现受保护函数(必须用 定义\prgNewFunction
)并在分割表体之前将其替换为返回值:
\documentclass{article}
\usepackage{tabularray}
\UseTblrLibrary{functional}
\begin{filecontents*}[overwrite]{test1.tex}
first & desc1 \\
\end{filecontents*}
\begin{filecontents*}[overwrite]{test2.tex}
second & desc2 \\
\end{filecontents*}
\begin{document}
\begin{tblr}[evaluate=\fileInput]{hlines}
Key & Value \\
\fileInput{test1}
\fileInput{test2}
\end{tblr}
\end{document}
示例中\fileInput
是包中的一个预定义函数functional
。
一般来说,用这个库的一个函数就可以生成整个表体。