使用 \lowercase 技巧时出现“缺少 \begin{document}”

使用 \lowercase 技巧时出现“缺少 \begin{document}”

主要是出于好玩,我尝试%使用这个技巧让评论可操作\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}

在此处输入图片描述

相关内容