如何修剪从外部文件读取的每个文件名的 .tex?

如何修剪从外部文件读取的每个文件名的 .tex?

我有一个外部文本文件,其中包含 TeX 输入文件的名称列表。名称带有尾随扩展名.tex。例如,名为的外部文本文件data.txt包含以下列表:

a.tex
b.tex
c.tex

每个 TeX 输入文件在现有的同一目录中都有一个 PDF 文件data.txt

以下代码预期迭代不带扩展名的文件名并导入相应的PDF。

\documentclass{article}
\usepackage{graphicx}

\begin{document}
\newread\reader
\immediate\openin\reader=data.txt\relax
\loop
    \read\reader to \x
    \unless\ifeof\reader
        \includegraphics{\x}\par
\repeat
\immediate\closein\reader
\end{document}

您能帮我实现修剪宏来删除.tex\x

答案1

内核LaTeX2e提供了一些用于解析路径和扩展名的命令。最好使用它们进行此类解析。

\filename@parse扫描其参数并将其分成三部分,然后保存在宏\filename@area、、\filename@base\filename@ext

\documentclass{article}
\begin{document}
\makeatletter
\filename@parse{path/name.tex}
\filename@area, \filename@base, \filename@ext
\makeatother
\end{document}

在您的情况下\filename@base将表示修剪的文件名,没有路径或扩展名信息。

答案2

正如 Yiannis Lazarides 所说,\filename@parse可以使用内部 LaTeX2e 宏来解析文件名。但是,用于分离扩展名的代码假设文件名中只有一个点,并且其后的所有内容都是文件扩展名。因此,对于包含多个点的文件名,您将得到不正确的结果,如下所示。

我最近通过重新实现部分内部功能,为我的包添加了对多点文件名的支持currfile(显示当前文件名、路径、扩展名等)\filename@parse。遗憾的是,没有公共接口,但您可以按如下方式使用它:

\documentclass{article}
\usepackage{currfile}[2011/09/18]
\begin{document}
\makeatletter
\filename@parse{path/name.tex}
\filename@area, \filename@base, \filename@ext

% Will take 'width.dots.tex' as the extension
\filename@parse{path/name.with.dots.tex}
\filename@area, \filename@base, \filename@ext

% Works with internal 'currfile' redefinitions:
{
\let\filename@simple\currfile@parseext
\let\filename@base\@gobble
\filename@parse{path/name.with.dots.tex}
\filename@area, \filename@base, \filename@ext
}

\makeatother
\end{document}

答案3

这是一个可能的定义,其中还可以说明每个图形文件的选项

\documentclass{article}
\usepackage{graphicx}

\makeatletter
\newread\inclfromfile@read
\newcommand\includefromfile[2][]{%
  \openin\inclfromfile@read#2\relax
  \loop\read\inclfromfile@read to \@tempa
    \unless\ifeof\inclfromfile@read
    \filename@parse{\@tempa}%
    \begingroup\edef\x{\endgroup
      \noexpand\includegraphics[#1]{\filename@base}\noexpand\par}\x
  \repeat
  \closein\inclfromfile@read
}
\makeatother


\begin{document}
\begin{center}
\includefromfile[scale=1.2]{data.txt}
\end{center}
\end{document}

请注意,在和\immediate之前不执行任何操作(它与和不同,在没有和的情况下, 命令将在涉及它们的下一个操作期间执行)。\openin\closein\openout\closeout\immediate\shipout

重要的是要说\noexpand\par,在某些环境(尤其是center)中,\par被重新定义为宏。

相关内容