在 Latex 中使用 PythonTex 中定义的参数打开文件

在 Latex 中使用 PythonTex 中定义的参数打开文件

我有一个可以检测文件的 Python 代码。现在我将在 Latex 中打开它。但似乎无法将检测到的名称提供给 Latex 我尝试过以下方法:

\begin{pycode}
l = [f for f in os.listdir('path') if f.endswith('.jpg')]
\end{pycode}
\includegraphics[scale=0.1]{\py{l}}

因为它不起作用所以我使用了这个:

\newcommand{\filename}{}
\edef\filename{l}

\includegraphics[scale=0.75]{\filename}

我需要这个,因为我有不同的文件。它们的文件名如下:part1_date,part1 始终相同,只有日期可变。因此,文本中应引用日期(例如,像引用方程式一样。当然,必须将其打印出来。

可以使用 Pythontex 来实现这一点吗?或者我可以用其他方法来实现这一点吗?

谢谢

答案1

\py不可扩展。因此它不能直接用作 的文件名\includegraphics。但\py可用于输出定义宏的 TeX 代码。然后宏包含字符串并可用于\includegraphics

例子:

\documentclass{article}
\usepackage[a4paper,vmargin=2cm]{geometry}
\usepackage{pythontex}
\usepackage{graphicx}
\usepackage{url}
\usepackage{multido}

\begin{document}
\begin{pycode}
l = [f for f in os.listdir('../') if f.endswith('.jpg')]
\end{pycode}
\py{"\\def\\NumberOfFiles{" + "{}".format(len(l)) + "}"}
\providecommand*{\NumberOfFiles}{0}

\DeclareRobustCommand*{\PrintFile}[1]{%
  \expandafter\PrintFileAux\expandafter{\number#1}%
}
\newcommand*{\PrintFileAux}[1]{%
  \py{"\\path{" + l[#1] + "}"}%
}

\DeclareRobustCommand*{\DefFileName}[1]{%
  \expandafter\DefFileNameAux\expandafter{\number#1}%
}
\newcommand*{\DefFileNameAux}[1]{%
  \py{"\\def\\FileName{" + l[#1] + "}"}%
  \providecommand*{\FileName}{}%
}

\tableofcontents

\section{\NumberOfFiles\ file\ifnum\NumberOfFiles>1 s\fi}

\multido{\i=0+1}{\NumberOfFiles}{%
  \subsection{\PrintFile{\i}}%
  \DefFileName{\i}%
  \ifx\FileName\empty
  \else
    \includegraphics[height=\baselineskip]{\FileName}%
  \fi
}%
\end{document}

结果

评论:

  • 当前目录是..,因为 python 是在辅助目录pythontex-files-<jobname>(<jobname>是主 LaTeX 文件的名称,不带扩展名) 中执行的。

  • 如果路径名包含特殊字符(例如_),则打印时需要多加注意。可以将其打印为逐字文本。该示例使用\path包中的宏url

  • 遍历所有文件可以用不同的方式完成。该示例使用\multido包在 LaTeX 中实现循环multido

    或者,也可以通过调用以文件名和/或日期作为参数的 LaTeX 宏在 Python 中实现循环。

  • 可以在 TeX 级别分析文件名以提取日期。更舒服的方式是使用 Python 提取日期并将其转换为所需的格式。

相关内容