1

我正在尝试在乳胶中创建一个环境,在 TeX 文件中逐字写入 \begin{environment} 和 \end{environment} 之间的行。

我已经尝试过 fancyvrb 包,它可以工作,但是如果我在源文件中指定了几个 \begin{environment} ,则只有最后几行被写入输出文件(我猜 VerbatimOut 每次都重新创建输出文件,并且不会追加给它)。

有人对此有领导吗?谢谢!

4

2 回答 2

1

我遇到了同样的问题并解决了如下。

文件 verbatimappend.tex (注意 LaTeX 写入的文件不再是参数,因为它在 verbatimwrite 环境中,而是在 \verbatimFile 中定义):

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{moreverb}

\makeatletter
\def\verbatimappend{% inspired by moreverb.sty (verbatimwrite)
  \@bsphack
  \let\do\@makeother\dospecials
  \catcode`\^^M\active \catcode`\^^I=12
  \def\verbatim@processline{%
    \immediate\write\verbatimFile%
      {\the\verbatim@line}}%
  \verbatim@start}
\def\endverbatimappend{%
  \@esphack%
}
\makeatother

\begin{document}

\newwrite\verbatimFile
\immediate\openout\verbatimFile=verbatimFile.txt\relax%

\begin{verbatimappend}
Hello, world!
\end{verbatimappend}

\input{random_chars.tex}

\begin{verbatimappend}
Bye, world!
\end{verbatimappend}

\immediate\closeout\verbatimFile

\end{document}

我对其进行了如下压力测试。文件 random_chars.pl:

#! /usr/bin/perl
use warnings;
use strict;
binmode STDOUT, ":utf8";
binmode STDERR, ":utf8";

my @ords = (32..126, 160..255); # usable latin-1/latin-9 codepoints
my $N = scalar @ords;
my @lines = ( );

sub choose_random_char {
  my $ord = int(rand($N));
  return chr($ords[$ord]);
}

while ((scalar @lines) < 10000) {
  my $line = join('', map { choose_random_char() } (1..78));
  next if $line =~ m/\\end{verbatimappend}/sx; # probably very unlikely!
  next if $line =~ m/\s+$/sx; # final spaces do not get output -> false positive
  push @lines, $line;
}

print join("\n", @lines, '');
print STDERR join("\n\n",
  (map { "Paragraph\n\n\\begin{verbatimappend}\n$_\n\\end{verbatimappend}" } @lines), '');

要使用它们:

$ perl random_chars.pl  > random_chars.txt 2> random_chars.tex 
$ latex verbatimappend.tex 
$ diff random_chars.txt verbatimFile.txt 

请注意 random_chars.pl 中排除的特定情况:

  next if $line =~ m/\\end{verbatimappend}/sx; # probably very unlikely!
  next if $line =~ m/\s+$/sx; # final spaces do not get output -> false positive

不确定如何/是否可以/应该将其发送给 https://www.ctan.org/pkg/moreverb 包作者,因为该包似乎没有维护。

HTH。

于 2017-02-08T05:21:10.163 回答
0

这是一个稍微间接的答案,但 Victor Eijkhout 的comment包做了类似的事情,因为它以与 LaTeX 相同的方式处理“逐字”块。如果不是这样,那么它的实现会建议如何手动执行此操作(也就是说,这个包是我自己复制时复制的)。

如果做不到这一点,您可能想在TeX Stackexchange 网站上提问。

于 2015-06-19T15:24:06.370 回答