问题:是否存在类似于注释环境的环境,可以抑制文本和空格,但可以使用内联命令调用?
我正在尝试开发一种更好的方法将我的解决方案输入到我的家庭作业集中。理想情况下,我希望在序言中有一些我注释/取消注释以包含/排除解决方案的内容。我在下面有一个 MWE 来演示我试图实现的东西的类型,但当然,在它目前的形式下,它不起作用。
\documentclass[12pt]{article}
\newenvironment{solution}{}{}
\newcommand{\soln}{\begin{solution}}
\newcommand{\solnend}{\end{solution}}
\newcommand{\nosolutions}{
\renewcommand{\soln}{\begin{comment}}
\renewcommand{\solnend}{\end{comment}}
}
%\nosolutions
\begin{document}
What is a question?
\soln
Not an answer.
\solnend
\end{document}
我知道有一种方法可以部分成功完成我正在尝试做的事情,那就是使用可选参数定义新命令。我遇到的问题是,当我遇到一个很长的多个部分的问题时,可能需要花费相当多的时间才能真正找到代码的相关部分(作为参考,我使用的是与 Sumatra 配对的 WinEdt,因此我可以双击 Sumatra 中的 pdf,它会带我到代码的那部分;但是,如果使用可选参数,我总是会被带到最后)。下面是演示此方法的 MWE。
\documentclass[12pt]{article}
\newenvironment{solution}{}{}
\newcommand{\soln}[1]{\begin{solution}#1\end{solution}}
\newcommand{\nosolutions}{
\renewcommand{\soln}[1]{}
}
\nosolutions
\begin{document}
What is a question?
\soln{
Not an answer.
}
\end{document}
最后一个问题:是否有类似可用的评论环境,可以抑制文本和空格?
答案1
如果我理解了您的问题和示例文件,我认为该包scontents
适合这项工作:
\documentclass{article}
\usepackage{scontents}
\newenvsc{solution}[store-env=solution,print-env=false]
\pagestyle{empty}
\setlength{\parindent}{0pt}
\begin{document}
\section{Only questions}
What is a question?
\begin{solution}
Not an answer.
\end{solution}
What is the next question?
\begin{solution}
An answer.
\end{solution}
\section{Questions with answer}
Other question?
\begin{solution}[print-env=true]
Other answer.
\end{solution}
\section{Only solutions}
% Print solutions
\getstored[1]{solution}\par
\getstored[2]{solution}
% OK, print last
\getstored[3]{solution}
\section{Use default command}
Really another question?
\Scontents[store-cmd=solution]{Yes, other answer}
% now print
\getstored[4]{solution}
\end{document}
如果我们切换到print-env=true
事实是,您可以使用包选项、使用命令\setupsc
或使用本地选项[print-env=<true|false>]
,[print-cmd=<true|false>]
当前版本(尚未)允许您创建自定义命令,仅允许您创建环境,我建议您阅读文档。(例如,感谢@Werner)
答案2
您可以定义\soln
抓取所有内容\solnend
,然后设置它(\showsolutions
)或不设置(\nosolutions
)。
\documentclass{article}
\newcommand{\showsolutions}{\long\def\soln##1\solnend{##1}}
\newcommand{\nosolutions}{\long\def\soln##1\solnend{}}
\showsolutions
%\nosolutions
\begin{document}
What is a question?
\soln
Not an answer.
\solnend
What is the next question?
\soln
An answer.
\solnend
\end{document}
和\showsolutions
:
和\nosolutions
:
要理解 的定义\soln
,您必须了解\def
其工作原理。\def
具有以下语法(来自第 203 页)TeX 书):
定义具有一般形式
\def<control sequence><parameter text>{<replacement text>}
其中
<parameter text>
不包含括号,并且中的所有{
和都正确嵌套。此外,符号具有特殊意义:在 中,第一次出现的 后面必须跟,下一次跟,依此类推;最多允许九个 。在每个中, 后面必须跟在之后出现的数字,否则 后面应该跟另一个。后一种情况代表宏展开时的单个标记;前一种情况代表插入相应的参数。}
<replacement text>
#
<parameter text>
#
1
2
#
<replacement text>
#
#
<parameter text>
#
#
#
...
你可能会问,TeX 如何确定参数在何处结束。答案:有两种情况。分隔参数
<parameter text>
在到达参数文本的末尾或下一个参数标记之前,后面跟着一个或多个非参数标记;在这种情况下,相应的参数是具有正确嵌套组的最短(可能为空)标记序列{...}
,输入中后面跟着这个特定的非参数标记列表。(类别代码和字符代码必须匹配,控制序列名称必须相同。)未限定参数在 中紧接着<parameter text>
一个参数标记,或者它出现在参数文本的最末尾;在这种情况下,相应的参数是下一个非空白标记,除非该标记是“{
”,此时参数将是{...}
后面的整个组。在这两种情况下,如果以这种方式找到的参数具有“ ”的形式{<nested tokens>}
,其中<nested tokens>
代表任何正确嵌套在括号中的标记序列,则包围参数的最外层括号将被删除,并将保留<nested tokens>
。
\soln
(下)的定义\showsolutions
使用分隔参数在里面<parameter text>
:
\def\soln#1\solnend{#1}
因此,\soln
将抓取以下所有\soln
内容明确的 \solnend
在输入流中(因此,实际上,\soln
和之间的所有内容\solnend
,并称之为#1
)并按原样设置它(<replacement text>
就是抓取的任何东西 - #1
)。因此,您不能在输入流中\soln
没有未来的情况下使用它们\solnend
;它们一起。
在 下\nosolutions
,同样的事情也会发生(a分隔参数在 中<parameter text>
),但捕获的任何内容都不会设置(#1
在 内没有<replacement text>
)。
我们使用一个\long
\def
初始化,因为参数#1
-\soln
和之间的任何内容\solnend
- 可以包含文本段落(否则常规\def
就足够了)。
另外,由于 的定义\soln
是在另一个宏(\showsolutions
和/或\nosolutions
)中做出的,因此#
需要将 加倍(参见第 329 页练习 20.5 的答案)TeX 书籍)。
答案3
以下基本示例应该可以工作
\documentclass{article}
\usepackage{comment}
\includecomment{soln} % Change to \excludecomment if you don't want solutions printed
\begin{document}
Q: why does the chicken cross the road.
\begin{soln}
A: To get to the other side
\end{soln}
\end{document}
如果你不想使用环境,而是想使用宏来打开和关闭评论,那么有一些历史代码您可以查看它是否执行了您想要的操作。