![使用 \lowercase 技巧时出现“缺少 \begin{document}”](https://linux22.com/image/318587/%E4%BD%BF%E7%94%A8%20%5Clowercase%20%E6%8A%80%E5%B7%A7%E6%97%B6%E5%87%BA%E7%8E%B0%E2%80%9C%E7%BC%BA%E5%B0%91%20%5Cbegin%7Bdocument%7D%E2%80%9D.png)
主要是出于好玩,我尝试%
使用这个技巧让评论可操作\lowercase
。出于某种原因,我收到了一个奇怪的(对我来说)错误:
ERROR: LaTeX Error: Missing \begin{document}.
--- TeX said ---
See the LaTeX manual or LaTeX Companion for explanation.
Type H <return> for immediate help.
...
l.22 \VisibleComments
通常,当我遇到此类错误时,是因为某个地方的括号组不平衡。据我所知,这里不是这种情况。
平均能量损失
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\cs_new_protected:Nn \vc_make_comment:n
{ \textbf{Comment: `#1'} }
\cs_new:Nn \vc_visible_comments:
{
\group_begin:
\char_set_lccode:nn {`\~} {`\%}
\tl_to_lowercase:n
{ \group_end: \cs_set_eq:NN ~ } \vc_make_comment:n
\char_set_catcode_active:N \%
}
\NewDocumentCommand \VisibleComments { }
{ \vc_visible_comments: }
\ExplSyntaxOff
\VisibleComments
\begin{document}
Hello, this is a % comment
\end{document}
Expecting: Hello, this is a \textbf{Comment: `comment'}
答案1
'\lowercase
技巧' 依赖于您有一个已经处于活动状态的字符。文档中通常的字符是~
纯文本、LaTeX 和 ConTeXt 中的活动字符,用于创建不间断空格。但是,在expl3
代码块内部它是一个空格,因此您会得到错误的结果(您实际上已经进入了\cs_set_eq:NN}...
)。您可以通过使其处于活动状态来修复此问题:
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\cs_new_protected:Nn \vc_make_comment:n
{ \textbf{Comment: `#1'} }
\group_begin:
\char_set_catcode_active:N \~
\cs_new_protected:Nn \vc_visible_comments:
{
\group_begin:
\char_set_lccode:nn {`\~} {`\%}
\tl_to_lowercase:n
{ \group_end: \cs_set_eq:NN ~ } \vc_make_comment:n
\char_set_catcode_active:N \%
}
\group_end:
\NewDocumentCommand \VisibleComments { }
{ \vc_visible_comments: }
\ExplSyntaxOff
\VisibleComments
\begin{document}
Hello, this is a % comment
\end{document}
但是,团队正在努力提供比上述更好的界面(改变大小写实际上与使某些东西活跃有关)。当前(仍处于试验阶段)的界面是
\cs_new_protected:Nn \vc_visible_comments:
{
\char_set_active_eq:NN \% \vc_make_comment:n
\char_set_catcode_active:N \%
}
的定义最近发生了变化\char_set_active_eq:NN
:在当前版本中,它的意思是“将的行为设置#1
为等于#2
如果 #1
处于活动状态”。因此,实际上使令牌处于活动状态是第二步,如上所示。
答案2
但是,你的问题并没有“抓取到行尾”。以下是来自老问题我问。
\documentclass{scrartcl}
\usepackage{xparse}
\ExplSyntaxOn
\group_begin:
\char_set_catcode_other:N \^^M %
\cs_new_protected:Npn \cs_new_delimited_by_newline:Nn #1 #2 %
{ %
\cs_new_protected:Npn #1 %
{ %
\group_begin: %
\char_set_catcode_other:N \^^M %
\use:c { __ \cs_to_str:N #1 } %
} %
\cs_new_protected:cpn { __ \cs_to_str:N #1 } ##1 ^^M %
{ %
#2 %
\group_end: %
} %
} %
\group_end:
\cs_new_delimited_by_newline:Nn \vc_make_comment:w
{ \vc_make_comment:n { \tl_trim_spaces:n {#1} } }
\cs_new_protected:Npn \vc_make_comment:n #1
{ \textbf{Comment: ~ `#1'} }
\cs_new_protected:Nn \vc_visible_comments:
{
\char_set_active_eq:NN \% \vc_make_comment:w
\char_set_catcode_active:N \%
}
\NewDocumentCommand \VisibleComments { }
{ \vc_visible_comments: }
\ExplSyntaxOff
\VisibleComments
\begin{document}
Hello, this is a % comment
\end{document}