假设我已经使用 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}