如何在编译 .tex 文件之前用空格替换制表符?

如何在编译 .tex 文件之前用空格替换制表符?

我想在 verbatim 环境中缩进文本。我想使用制表符来实现这一点。问题是 verbatim 并不像宣传的那样工作(“打印未修改的文本”)。它实际上用空格替换制表符并设法将它们全部压缩在一起,请参阅下面的 MWE。要解决这个问题,可以用空格替换制表符。

\documentclass{article}

\begin{document}
I'm regular text
\begin{verbatim}
I have no tab
    I have 1 tab
        I have 2 tabs

I have no space
    I have 4 spaces
        I have 8 spaces

\end{verbatim}
\end{document}

MWE 输出

我更喜欢在编辑文本时使用制表符。毕竟,这是它的预期用途。为了继续使用制表符,但要获得所需的结果(这需要空格),我必须以某种方式将这些制表符转换为空格。

我该怎么做?是否有可以传递的命令行参数来进行此类替换?我真的很喜欢 verbatim 环境的简单性,但也许我对此要求太多,而应该使用其他包?如果是,哪一个?或者是否可以将 verbatim 配置为以某种方式与制表符一起使用?

我用来pdflatex --file-line-error-style "%f"将 tex 转换为 pdf,顺便问一下,%f文件在哪里


expand命令正是我要找的。我不想创建中间文件,因此我将输出导入 pdflatex

**之前:** 编译上面的 MWE(第一行是使用的命令)而不扩展:

pdflatex --file-line-error-style "tab test.tex"

This is pdfTeX, Version 3.1415926-2.5-1.40.14 (TeX Live 2013/Debian)
 restricted \write18 enabled.
entering extended mode
(./tab test.tex
LaTeX2e <2011/06/27>
Babel <3.9h> and hyphenation patterns for 9 languages loaded.
(/usr/share/texlive/texmf-dist/tex/latex/base/article.cls
Document Class: article 2007/10/19 v1.4h Standard LaTeX document class
(/usr/share/texlive/texmf-dist/tex/latex/base/size10.clo)) (./tab test.aux)
[1{/var/lib/texmf/fonts/map/pdftex/updmap/pdftex.map}] (./tab test.aux) )</usr/
share/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmr10.pfb></usr/share/t
exlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmtt10.pfb>
Output written on "tab test.pdf" (1 page, 23531 bytes).
Transcript written on "tab test.log".

后:使用 编译 MWE expand,然后将其导入 pdflatex。由于某种原因,输出有点长,看起来像是空行,但 pdf 是使用正确名称创建的,并且选项卡已被替换。太棒了!

expand -t 2 tab\ test.tex | pdflatex --file-line-error-style -jobname="tab test"

This is pdfTeX, Version 3.1415926-2.5-1.40.14 (TeX Live 2013/Debian)
 restricted \write18 enabled.
**entering extended mode
LaTeX2e <2011/06/27>
Babel <3.9h> and hyphenation patterns for 9 languages loaded.

*(/usr/share/texlive/texmf-dist/tex/latex/base/article.cls
Document Class: article 2007/10/19 v1.4h Standard LaTeX document class
(/usr/share/texlive/texmf-dist/tex/latex/base/size10.clo))
(Please type a command or say `\end')
*(./tab test.aux)
*
*
*
*
*
*(Please type a command or say `\end')
*
*
*
*(Please type a command or say `\end')
*
*[1{/var/lib/texmf/fonts/map/pdftex/updmap/pdftex.map}] (./tab test.aux)</usr/sh
are/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmr10.pfb></usr/share/tex
live/texmf-dist/fonts/type1/public/amsfonts/cm/cmtt10.pfb>
Output written on "tab test.pdf" (1 page, 23537 bytes).
Transcript written on "tab test.log".

答案1

正如 Mike Renfro 在评论中指出的那样,许多文本编辑器都支持在制表符和空格之间进行转换;有些甚至会在您按下制表符键时打印一些空格,从而使转换变得无缝且透明。这可能是对您的确切问题的最简单的答案。

如果您恰好是 Linux(可能是 OSX)用户,则另一个解决方案是使用命令expand。在命令行中,如果您运行expand -t 4 file.tex > new_file.tex中的所有制表符都file.tex将转换为 4 个空格,因为文件是在 中复制的new_file.tex。有关更多信息,请参阅expand命令

也可以看看unexpand

答案2

使用fancyvrb包:

\documentclass{article}
\usepackage{fancyvrb}

\fvset{tabsize=4}

\begin{document}
I'm regular text
\begin{Verbatim}
I have no tab
	I have 1 tab
		I have 2 tabs

I have no space
    I have 4 spaces
        I have 8 spaces
\end{Verbatim}
\end{document}

在此处输入图片描述

该网站正在将制表符更改为四个空格,因此这可能看起来像是作弊,但在我的文件中我有制表符。

相关内容