除非我删除它的文件夹,否则 pythontex 不会考虑某些更改?

除非我删除它的文件夹,否则 pythontex 不会考虑某些更改?

过去,我曾问过一个关于通过 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}

相关内容