在表格环境中执行不可扩展的代码

在表格环境中执行不可扩展的代码

由于没有\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。您只能在行之间(即在行的开头)使用这些,这实际上是您原始问题的根源。但是,可以有多个\noaligns 接在一起。

以下定义了一个\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事物只是表格的一部分。

相关内容