【问题标题】:LaTeX: appending verbatim lines to an out fileLaTeX:将逐字行附加到输出文件
【发布时间】:2015-09-05 13:44:12
【问题描述】:

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

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

有人对此有意见吗?谢谢!

【问题讨论】:

    标签: file append latex external verbatim


    【解决方案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。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 2021-02-28
        • 2017-03-20
        • 2021-09-03
        • 2011-11-15
        • 2021-03-30
        • 2016-06-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多