我有一个可以检测文件的 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 提取日期并将其转换为所需的格式。