TeX 在获取命令的参数时,参数的 catcode 已经固定了,多个空格合并为一个,行结束符(一般是换行符)转为空格。所以再使用修改 catcode 的命令(比如 \obeyspaces
)已经无效了。
要么用环境,且不能用 b
参数,要么原样获取参数,然后重新扫描(使用 \scantokens
或 \tl_rescan:nn
及类似命令)。
\documentclass{article}
\begin{document}
\ExplSyntaxOn
\NewDocumentCommand{\test}{ O{\linewidth} +v }
{
\coffin_clear:N \l_tmpa_coffin
\vcoffin_set:Nnn \l_tmpa_coffin {#1}
{ % 注意如果 \parindent>0pt 这里会有缩进
\small \ttfamily
\obeyspaces
\obeylines
\scantokens{#2}
\ignorespacesafterend
}
\coffin_typeset:Nnnnn \l_tmpa_coffin {H}{l}{0pt}{0pt}
}
\ExplSyntaxOff
\noindent % 移除段首缩进
\test{ha ha
hahahha
}
\end{document}
当然也还有其它办法,不过比这个略微复杂。
PS:使用 varwidth
还能有不一样的效果:
\documentclass{article}
\usepackage{varwidth}
\begin{document}
\ExplSyntaxOn
\NewDocumentCommand{\testa}{ O{\linewidth} +v }
{
\coffin_clear:N \l_tmpa_coffin
\hcoffin_set:Nn \l_tmpa_coffin
{
\varwidth [b] { \dim_eval:n {#1} }
\dim_set:Nn \parindent { \c_zero_dim }
\small \ttfamily
\obeyspaces
\obeylines
\scantokens{#2}
\endvarwidth
}
% \coffin_typeset:Nnnnn \l_tmpa_coffin {H}{l}{0pt}{0pt}
\coffin_display_handles:Nn \l_tmpa_coffin { blue }
}
\NewDocumentCommand{\testb}{ O{\linewidth} +v }
{
\coffin_clear:N \l_tmpa_coffin
\vcoffin_set:Nnn \l_tmpa_coffin {#1}
{
\dim_set:Nn \parindent { \c_zero_dim }
\small \ttfamily
\obeyspaces
\obeylines
\scantokens{#2}
\ignorespacesafterend
}
% \coffin_typeset:Nnnnn \l_tmpa_coffin {H}{l}{0pt}{0pt}
\coffin_display_handles:Nn \l_tmpa_coffin { red }
}
\ExplSyntaxOff
\noindent
\testa{ha ha
hahahha
}
\vspace{1cm}
\noindent
\testb{ha ha
hahahha
}
\end{document}
问 如何在coffin里实现\obeyspaces 和\obeylines 命令所指定的效果?