注释包和宏.sty文件导致问题,为什么?

注释包和宏.sty文件导致问题,为什么?

这里是main.tex

\documentclass{article}
\usepackage[utf8]{inputenc}

\usepackage{comment}

\usepackage{tcolorbox}
\tcbuselibrary{theorems}

\newtcbtheorem[]{myprob}{Problem}%
{colframe=blue!35!black,enlarge top by=0.15cm,fonttitle=\slshape,breakable}{prob}


\includecomment{analysis}
\includecomment{solution}

\usepackage{ana}

\title{Testing Doc}
\author{}
\date{}

\begin{document}

\maketitle

\begin{analysis}
\section{Analysis}
\subsection{Basic Integration}
\csname ANAsp2015p1\endcsname
\end{analysis}

\end{document}

ana.sty

\ProvidesPackage{ana}[2021/08/11 Analysis Problems]

\expandafter\newcommand\csname ANAsp2015p1\endcsname{
\begin{myprob}{Spring 2015 Problem 1}{}
blah
\end{myprob}

\begin{solution}
Proof:
\end{solution}
}

Overleaf 告诉我“!扫描 \next 时文件结束”,以及“我怀疑您忘记了 '}',导致我读到了您希望我停止的地方”。如果我\begin{solution}...\end{solution}从中删除以下内容ana.sty

\ProvidesPackage{ana}[2021/08/11 Analysis Problems]

\expandafter\newcommand\csname ANAsp2015p1\endcsname{
\begin{myprob}{Spring 2015 Problem 1}{}
blah
\end{myprob}
}

\begin{solution}...\end{solution}代码运行正常。最初我以为这与我将注释环境嵌套在另一个注释环境中有关\begin{analysis}...\end{analysis},但在我删除\begin{analysis}and之后错误仍然存​​在\end{analysis}。有人知道发生了什么吗?

我看过注释包和宏定义但没有人解释为什么会发生这个错误。

答案1

作为坎帕指出评论,这是一个 catcode 问题:

我记得环境solution希望通过查找来自\end{solution}在 verbatim-catcode-régime 下对短语进行标记的标记来检测其结束。但是,在您的场景中,该短语未在 verbatim-catcode-régime 下进行标记,但在对 的定义进行标记时,它已在通常的 catcode-régime 下进行了标记\ANAsp2015p1

您可以通过让标记构成读取定义\ANAsp2015p1并在 verbatim-catcode-régime 下进行标记并定义\ANAsp2015p1将这些标记传递给\scantokens重新标记来规避该问题。

以下示例提供了一个\DefineProbSolCmd可执行这些操作的命令。与\verbverbatim-environment 等类似,该命令\DefineProbSolCmd只能在通过从 .tex-input-file 读取和标记来直接获取其参数的情况下使用。该命令\DefineProbSolCmd不能用作宏参数的组成部分、宏的定义文本的组成部分或标记寄存器的内容的组成部分等。

\ProvidesPackage{ana}[2021/08/12 Analysis Problems]
\RequirePackage{xparse}

\NewDocumentCommand\DefineProbSolCmd{}{%
  \begingroup
  \catcode`\^^I=12\relax % Give "horizontal tab" catcode 12. See comment below for the reason.
  \InnerDefineProbSolCmd
}%
\begingroup
\catcode`\^^A=14
\catcode`\%=12
\@firstofone{^^A
  \endgroup
  \NewDocumentCommand\InnerDefineProbSolCmd{m+v}{^^A
    \endgroup
    \expandafter\newcommand\csname#1\endcsname{\begingroup\newlinechar=\endlinechar\scantokens{\endgroup#2%}}^^A
  }^^A
}%
% Reason for changing the catcode of horizontal tab:
% xparse's processor of v/+v-arguments leaves the catcode of
% "horizontal tab" at 10(space) so that tokenizing horizontal tabs
% yields space-tokens, which is undesired at this stage of
% processing.
%
\DefineProbSolCmd{ANAsp2015p1}{%
\begin{myprob}{Spring 2015 Problem 1}{}
blah
\end{myprob}

\begin{solution}
Proof:
\end{solution}
}%
\documentclass{article}
\usepackage[utf8]{inputenc}

\usepackage{comment}

\usepackage{tcolorbox}
\tcbuselibrary{theorems}
\tcbuselibrary{breakable}


\newtcbtheorem[]{myprob}{Problem}%
{colframe=blue!35!black,enlarge top by=0.15cm,fonttitle=\slshape,breakable}{prob}


\includecomment{analysis}
\includecomment{solution}

\usepackage{ana}

\title{Testing Doc}
\author{}
\date{}

\begin{document}

\maketitle

\begin{analysis}
\section{Analysis}
\subsection{Basic Integration}
\csname ANAsp2015p1\endcsname
\end{analysis}

\end{document}

在此处输入图片描述

正在使用环境“解决方案”。如果我必须在课堂上布置作业,我绝不会制作一张漂亮的纸来记录解决方案。尽量减少解决方案落入课程参与者手中并被传阅的机会。在讨论解决方案时,我更喜欢板书,因为在黑板上书写可以调节信息传递的速度,从而更好地吸收信息。

相关内容