由于没有\InputIfFileExists 或 \IfFileExists 的可扩展版本tabular
,问题来了,到底是否可以在环境中执行不可扩展的代码:
文件main.tex
:
\documentclass{standalone}
\usepackage{booktabs}
% How to implement this? %
\newcommand\InsideTabularInputIfFileExists[1]{...}
% How to implement this? %
% Do not change anything here %
\begin{document}
\begin{tabular}{ll}
\InsideTabularInputIfFileExists{inp.tex}
\end{tabular}
\end{document}
% Do not change anything here %
文件inp.tex
:
\toprule
a & b \\
c & d \\
\bottomrule
答案1
可以将不可展开的代码放入\noalign{..}
表达式中。可以使用特殊技巧动态添加结束符}
,从而允许宏\noalign
在内部测试为真时在后面插入代码。
\noalign
用于不应与表格格式对齐的材料,即放入单元格中。所有水平线(如\hline
或 )\toprule
都使用 完成\noalign
。您只能在行之间(即在行的开头)使用这些,这实际上是您原始问题的根源。但是,可以有多个\noalign
s 接在一起。
以下定义了一个\NoAlignInputIfFileExists{<filename>}
可以按预期使用的,但如果不在表格行之间使用,则会产生错误:
\documentclass{standalone}
\usepackage{booktabs}
\makeatletter
\newcommand*\NoAlignInputIfFileExists[1]{%
\noalign{\ifnum 0=`}\fi
\IfFileExists{#1}
{\ifnum 0=`{\fi }\@@input #1 }%
{\ifnum 0=`{\fi }}%
}
\makeatother
\begin{document}
\begin{tabular}{ll}
% must be used at the beginning of a tabular line, but
% can be mixed with other \noalign commands like \hline etc.
\NoAlignInputIfFileExists{inp}
\end{tabular}
\end{document}
稍微解释一下这段高级代码:\noalign
框/在读取内容时执行它。它不会将 读{..}
作参数,因此不会直接查找结尾的}
。这里\noalign{\ifnum 0=`}\fi
用到了技巧。}
实际上是被删除的,因为 是\ifnum
假的。但是, 既能\newcommand
看到开头{
,又能看到结尾,}
所以很高兴它们的数量匹配。 的实际结尾}
存在\noalign
两次:每个 if/else 子句中各一次。在 的执行过程中,\ifnum 0=`{\fi }
使用 来删除,而 又需要存在 才能使定义满意。{
\noalign
\newcommand
答案2
我相信,与明确的环境相比,使用命令可以更轻松地实现您的需求tabular
:
\documentclass{article}
\usepackage{booktabs}
\makeatletter
\newcommand{\tabularinput}[2]{%
\IfFileExists{#1}
{\begin{tabular}{#2}
\@@input #1
\end{tabular}}
{INEXISTENT FILE #1}%
}
\makeatother
\begin{document}
\tabularinput{inp}{ll}
\tabularinput{xxx}{ll}
\end{document}
我不推荐使用“环境”版本,它可以是 Martin 代码的修改版本:
\makeatletter
\newcommand{\expinput}[1]{%
\noalign{
\IfFileExists{#1}
{\gdef\expinput@temp{\@@input #1 }}
{\gdef\expinput@temp{INEXISTENT FILE #1}}
}\expinput@temp}
\makeatother
但我不知道如何
\begin{tabular}{ll}
\expinput{inp}
\end{tabular}
优于\tabularinput{inp}{ll}
,除非该\input
事物只是表格的一部分。