假设在我的 LaTeX 文件中,我需要创建一个 Python 环境来执行一些不会创建任何 LaTeX 代码的 Python 代码。Python 环境仍会创建一个(空白)小页面,从而导致出现垂直空白。有没有一种 LaTeX 方法来编译 Python 环境并删除小页面?
例如假设我有这个 LaTeX 片段:
Before
\begin{python}
f = open('abc.txt', 'w')
f.write('hello')
f.close()
\end{python}
After
我希望 pdflatex 生成的 pdf 中包含以下内容:
Before After
并执行python环境中的python代码。
这是一个最小工作示例:
\documentclass{article}
\usepackage{python}
\begin{document}
Before
\begin{python}
f = open('a.txt', 'w')
f.write("hello")
f.close()
\end{python}
After
\end{document}
使用以下方法编译
pdflatex --shell-escape main.tex
答案1
这是使用comment
包的另一种解决方案,python
它不会出现多余的换行符和空格问题。此解决方案仅执行 Python 脚本,但不包含其输出。
将以下几行添加到你的序言中:
\usepackage{comment}
\specialcomment{python0}{%
\begingroup
\def\ProcessCutFile{}%
}{%
\immediate\write18{python comment.cut > comment.out 2> comment.err}%
\endgroup
}
然后,环境的内容python0
将写入文件comment.cut
,该文件将由python执行,所有输出将写入comment.out
,所有错误将写入comment.err
。与python
包一样,您必须使用pdflatex
选项--shell-escape
。
您的示例代码:
\documentclass{article}
\usepackage{comment}
\specialcomment{python0}{%
\begingroup
\def\ProcessCutFile{}%
}{%
\immediate\write18{python comment.cut > comment.out 2> comment.err}%
\endgroup
}
\begin{document}
Before
\begin{python0}
f = open('a.txt', 'w')
f.write("hello")
f.close()
\end{python0}
After
\end{document}
排版后的文档将如下所示
Before After
Before
两个单词之间的空格源自源代码中的空格/换行符之后(%
在 Before 之后添加即可避免这种情况)。
您可以将此解决方案与python
包一起使用,然后您就拥有了python
包含程序输出的环境和python0
不包含程序输出的环境。
答案2
不涉及 minipage。您看到的是用于包含 Python 程序输出的\input
命令的效果。尝试python.sty
Before\input{EmptyFile.txt}After
Before
你会注意到After
最终得出不同的结论。
一种解决方案是修改你的 python 程序,使用命令写入文件\unskip
,而不是空文件。
f = open('a.txt', 'w')
f.write("hello")
f.close()
print('\unskip')# <<<< Removes the newline between Before and After
这将导致 LaTeX 输出
Before After
这两个单词之间有四个空格。其中两个来自您的文档;您可以通过添加注释符号来删除它们。另外两个是来自样式文件的虚假空格python.sty
。除非您想创建此文件的个人副本(见下文),否则您可以通过在环境后添加两个\unskip
命令来删除这些空格python
。这是修改后的 LaTeX 源代码。
\documentclass{article}
\usepackage{python}
\begin{document}
Before% <<<< Removes a space
\begin{python}
f = open('a.txt', 'w')
f.write("hello")
f.close()
print('\unskip')# <<<< Removes the newline between Before and After
\end{python}% <<<< Removes a space
\unskip\unskip% <<<< Removes two spaces introduced by the way python.sty defines the python environment
After
\end{document}
修改python.sty
:这并不推荐,因为您的副本python.sty
将被冻结,并且不会从此包的未来更新中受益。无论如何,如果出于某种原因,您无法添加额外的\unskip\unskip
行,请复制python.sty
到包含文档的目录中。在 Unix 或 GNU/Linux 下,以下命令将样式文件复制到当前工作目录。
cp `kpsewhich python.sty` .
python.sty
使用任何文本编辑器打开的本地副本并添加两个%
符号。
更换线路
\gdef\@pythoninclude{#1}
经过
\gdef\@pythoninclude{#1}%
更换线路
\immediate\write18{cat \@pythoninclude\space\jobname.py | python > \jobname.py.out 2> \jobname.py.err}
经过
\immediate\write18{cat \@pythoninclude\space\jobname.py | python > \jobname.py.out 2> \jobname.py.err}%