过去,我曾问过一个关于通过 Python 在 tex 文档中包含多个图像的问题,并且得到了一个非常有效的解决方案(旧问题的链接)。
我的新问题:现在我注意到,在 LaTeX 中编译文档后添加新图像会导致新图像不通过 pythontex 进行考虑。只有在我pythontex-files-[documentname]
手动删除文件夹后才会添加新图像。我发现这个手动任务有点烦人,我正在寻找一种在不破坏我的代码的情况下自动执行此操作的方法,或者可能找到另一个更简单的解决方案。也许我只是做错了什么?
例子:假设我有以下文件结构:
├── Images
│ ├── Interesting image.jpg
│ └── Some image.jpg
├── pythontex-files-test
│ └── [Some files made by pythontex]
├── test.pdf
├── test.tex
└── [.aux, .log, .pytxcode, and .gz files]
现在我运行我的代码,它可以很好地添加这些图像:
\documentclass{article}
\usepackage{pythontex}
\usepackage{graphicx}
\begin{document}
My images:
\begin{pycode}
import os
import textwrap
directory = 'Images'
extension = '.jpg'
files = [fn for fn in os.listdir(directory) if fn.lower().endswith(extension)]
files.sort()
figs = []
for filename in files:
caption = filename.replace(r'_', r'\_')
caption = caption.split('.')[0]
directory_file = directory+'/'+filename
fig = fr'''
\begin{{figure}}[!ht]
\centering
\includegraphics[height=4cm]{{{directory_file}}}
\caption{{{caption}}}
\end{{figure}}
'''
figs.append(textwrap.dedent(fig))
print(''.join(figs))
\end{pycode}
\end{document}
结果如下,我很满意:
之后我将新图像添加到图片-文件夹名称新图像.jpg。
Images
├── Interesting image.jpg
├── new-image.jpg
└── Some image.jpg
我希望在再次编译时自动添加新图像。我的代码运行良好,没有任何错误,但除非我删除该pythontex-files-[documentname]
文件夹,否则不会添加新图像。只有手动删除该文件夹后,才会添加新图像。
我想知道这背后的原因——我在 CTAN 文档中找不到任何与此相关的内容。
有没有一种简单的方法可以在编译之前自动删除文件夹,而无需使用 Python 文件进行编译
os.system('pdflatex '+filename+'.tex')
?我已经尝试了以下方法,但没有效果:\begin{pycode} import os import textwrap pythontex_folder = 'pythontex-files-test' pythontex_files = [os.path.join(pth, f) for pth, dirs, files in os.walk(pythontex_folder) for f in files] for pth in pythontex_files: os.remove(pth) [...] \end{pycode}
是否有不同的方法来实现我想要的(例如,稍微改变我现有的代码)?
提前感谢你的帮助!
答案1
的缓存机制pythontex
可能会产生一些问题。我认为一个非常简单的解决方法是将代码保存在单独的 Python 文件中并从 LaTeX 中调用它。为了做到这一点,我们--shell-escape
在编译器中使用选项。在 TeXStudio 中,可以通过设置txs:///pdflatex --shell-escape
为标准编译器来完成此操作。您可以将图形代码保存到文件中并从 LaTeX 中调用,而不是打印出图形代码\input
。例如,这可以是您的 Python 文件figure.py
:
import os
import textwrap
directory = 'Images'
extension = '.jpg'
files = [fn for fn in os.listdir(directory) if fn.lower().endswith(extension)]
files.sort()
figs = []
for filename in files:
caption = filename.replace(r'_', r'\_')
caption = caption.split('.')[0]
directory_file = directory+'/'+filename
fig = fr'''
\begin{{figure}}[!ht]
\centering
\includegraphics[height=4cm]{{{directory_file}}}
\caption{{{caption}}}
\end{{figure}}
'''
figs.append(textwrap.dedent(fig))
# save figure content to figure.vrb
with open('figure.vrb', 'w') as outfile:
outfile.write(''.join(figs))
这是 TeX 文件的最小工作示例:
\documentclass{article}
\usepackage{expl3}
\begin{document}
\ExplSyntaxOn
% call python script, here I assume the binary name is python3
\sys_shell_now:n {python3~figure.py}
\ExplSyntaxOff
% input the generated figure file
\input{figure.vrb}
\end{document}