删除由 python 环境引入的换行符

删除由 python 环境引入的换行符

假设在我的 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}%
    

相关内容