排版预解析的逐字文本/代码

排版预解析的逐字文本/代码

假设我已经使用 xparse+v参数逐字解析了一些文本,那么以尊重原始格式的方式排版文本的最佳方法是什么?

请注意,我无法使用环境直接排版文本verbatim,因为我需要事先对文本进行温和的预处理。

我研究过verbatim环境如何设置排版,但不清楚各个部分在做什么,我想知道是否存在使用当前可用的 LaTeX3 工具的“现代”方法。

附录:使用参数解析文本后+v,它会通过一些正则表达式进行处理,然后在结束符处进行拆分并将其作为一组行存储在序列变量中,以便在排版之前将其写入外部文件。

示例代码:

\NewDocumentCommand \myverb { +v }
  { \kelly_verb:n { #1 } }

\tl_new:N \l__kelly_verb_body_tl
\seq_new:N \l__kelly_verb_lines_seq

\cs_new_protected:Nn \kelly_verb:n
  {
    \tl_set:Nn \l__kelly_verb_body_tl { #1 }
    \regex_replace_all:NnN \c__kelly_verb_regex { <replacement> }
      \l__kelly_verb_body_tl
    \kelly_set_split_lines:NV \l__kelly_verb_lines_seq
      \l__kelly_verb_body_tl
    \seq_map_inline:Nn \l__kelly_verb_lines_seq
       { \iow_now:Nn \g__kelly_output_iow { ##1 } }
    % Typeset here...
  }

答案1

以类似方式打印东西的一个例子verbatim

\documentclass[]{article}

\usepackage{xparse}

\ExplSyntaxOn
\cs_generate_variant:Nn \seq_set_split:Nnn { Nnv }
\tl_new:N \l_kelly_verbatim_text_tl
\seq_new:N \l_kelly_nolig_seq
\seq_set_split:Nnv \l_tmpa_seq { \do } { verbatim@nolig@list }
\seq_remove_all:Nn \l_tmpa_seq {}
\seq_map_inline:Nn \l_tmpa_seq
  {
    \seq_push:Nx \l_kelly_nolig_seq { \char_generate:nn { `#1 } { 12 } }
  }
\cs_new_protected:Npx \__kelly_replace_newline:n #1
  {
    \tl_replace_all:Nnn \exp_not:N \l_kelly_verbatim_text_tl
      { \char_generate:nn { 13 } { 12 } }
      { #1 }
  }
\cs_new_protected:Npn \__kelly_no_ligs:
  {
    \seq_map_inline:Nn \l_kelly_nolig_seq
      {
        \tl_replace_all:Nnn \l_kelly_verbatim_text_tl { ##1 }
          { \mode_leave_vertical: \kern \c_zero_dim ##1 }
      }
  }
\cs_new_protected:Npn \__kelly_verbatim_output:n #1
  {
    \group_begin:
    \dim_set_eq:NN \parindent \c_zero_dim
    \tl_set:Nn \l_kelly_verbatim_text_tl { #1 }
    \tl_replace_all:Nnn \l_kelly_verbatim_text_tl { ~ } { \hbox:n { ~ } }
    \__kelly_replace_newline:n
      {
        \mode_leave_vertical: \kern \c_zero_dim
        \par
        \mode_leave_vertical: \kern \c_zero_dim
      }
    \__kelly_no_ligs:
    \use:c { verbatim@font }
    \l_kelly_verbatim_text_tl
    \group_end:
  }
\NewDocumentCommand \MyVerbatim { +v }
  {
    % do your stuff
    \__kelly_verbatim_output:n { #1 }
  }
\ExplSyntaxOff

\begin{document}
\MyVerbatim
{
  \test\ this \verbatim\  text.

  new  line
aa
 ne

 line
}
\end{document}

相关内容