我怎样才能在 LaTeX 文档的一部分中制作练习,而在另一部分中选定答案?当然,我可以简单地分别排版问题和答案,但这很可能会导致在编辑文档时问题和答案的标签出现分歧。
我真正想要的是一个命令,它允许我在使用该命令时排版练习,并且带有一个可选参数,用于将解决方案存储到最后一节(章节或部分)“选定的练习答案”。我希望问题(和选定的答案)在输出中标记为 Chapter.Section.Question 甚至 Chapter.Question。
答案1
您可以使用考试在您的两个文档中都添加文档类。然后参考第 8 章:包括解决方案。
基本上,您可以在文档中的任何位置指定\printanswers
或在加载文档类时\noprintanswers
使用该选项。answers
如果您将实际的问题和答案放在单独的文档中,并将\input
其同时放入练习文档和示例解决方案文档中,那么最简单的方法就是这样做。
如果你想要一个包含答案的额外部分,你可以将\input
问题文档打印两次,一次在文档之前,一次在\printanswers
文档之后:这将导致第一次打印的问题没有答案,第二次打印的问题没有答案。和答案。
答案2
这答案包似乎做了类似的事情(执行texdoc answers
,或在您的平台上执行等效操作,以供文档使用)。
如果这不起作用,或者不太合适,那么我有一个针对此问题的手动解决方案,我可以在这里发布。
(复制自堆栈溢出问题)
好的:评论中的 Sam Nead 想要查看手写版本,因此我在下面部分包含了它。评论报告了从 Victor Eijkhout 那里继承而来的内容comment.sty
,但他不应该因为我破坏它的方式而受到指责。这并不完整,因为它没有显示最后读入的输出文件。它说明,如果您想用反斜杠写出内容,您可能不得不用 catcodes 做一些有趣的事情。当然,我从检查和改编 Eijkhout 的代码中学到了一些东西。
不提供任何明示或暗示的保证;内容物在处理过程中可能会沉淀;请勿摄入;并保持出色地放在儿童接触不到的地方。
%%% {examples} environment -- problem/example, to be collected at the end
%
% \if@examples is a flag to tell us if we've seen any examples yet.
\newif\if@examples \@examplesfalse
\newwrite\@exampleaux
\@definecounter{example}
%
% Don't use \newenvironment. Instead use the fact that \begin{env}
% turns into \begingroup\env . This code is simplified from
% Eijkhout's comment.sty
%
% The \@bsphack...\@esphack pair doesn't seem to want to work, here
% (well, it does in horizontal, but not in vertical, mode).
%
% The {example} environment takes an optional argument, giving the
% number of dangerousbend symbols to attach to the example. The
% default is zero (negative numbers are treated the same as zero,
% numbers larger than about 2 are probably silly, but will work).
%
% Unfortunately, because of the \@ifnextchar, and the fact that the
% contents of this environment are processed oddly, you can't have
% anything expandable immediately after the \begin{example}, unless
% you write \begin{example}[0] or \begin{example}\relax.
%
% The end of the environment must be \end{example} alone on a line
% (ie, no whitespace before or after). The same is true for the
% beginning and end of the {examplenotes} environment.
%
\def\makeother#1{\catcode`#1=12 }
\def\example{\@bsphack\@ifnextchar[%]
\@example{\@example[0]}}
% \@openexamples opens the examples file. Nilpotent.
\def\@openexamples{%
\if@examples \else
\immediate\openout\@exampleaux\jobname.examples%
\immediate\write\@exampleaux{\relax}%
\global\@examplestrue
\fi
}
\def\theexample{\@arabic\c@example}
\def\@example[#1]{%
\@openexamples
\refstepcounter{example}%
% Read in contents line by line, with all catcodes `other'
\let\do\makeother \dospecials %
\makeother\^^L%
\endlinechar`\^^M \catcode`\^^M=12 %
\immediate\write\@exampleaux %
{\string\begin{examplebody}%
{\theexample}%
{\csname the\LN@currsectionlevel\endcsname}%
{#1}%
}%
\if@screenpdf %
\marginpar{\small{\hyperlink{ex-\@arabic\c@example}{Ex.\theexample}}}%
\else %
\marginpar{\small{See example \theexample}}%
\fi %
\@tempswatrue
\ProcessExampleLine %
}
%
% Define \EndExampleTest, with all catcodes other
{\escapechar=-1 \xdef\EndExampleTest{\string\\end\string\{example\string\}}}
{\escapechar=-1 \xdef\BeginNotesTest{\string\\begin\string\{examplenotes\string\}}}
{\escapechar=-1 \xdef\EndNotesTest{\string\\end\string\{examplenotes\string\}}}
% Write out the body of the {example}, carefully surrounding the
% content of the {examplenotes} environment with
% \ifexamplenotes...\fi. Note this _requires_ that the beginning and
% end of the {examplenotes} environment appear on lines by
% themselves. Change the escape character so that we can write out
% \if..\fi without problems.
{\catcode`\^^M=12 \endlinechar=-1 \catcode`\|=0 |catcode`|\=12 %
|gdef|ProcessExampleLine#1^^M{|def|test{#1}%
|if@tempswa
|immediate|write|@exampleaux{\ifexampletext}|@tempswafalse
|fi
|ifx|BeginNotesTest|test %
|immediate|write|@exampleaux{\fi\ifexamplenotes}%
|fi %
|ifx|EndExampleTest|test %
|edef|next{%
|immediate|write|@exampleaux{\fi\end{examplebody}}%
|@esphack %
|endgroup %
}%
|else %
|immediate|write|@exampleaux{#1}%
|ifx|EndNotesTest|test %
|immediate|write|@exampleaux{\fi\ifexampletext}%
|fi %
|let|next|ProcessExampleLine %
|fi %
|next}%
}
% Add text to the examples file
\long\def\addtoexamples#1{%
\@openexamples
{\@temptokena{#1}%
\immediate\write\@exampleaux{\the\@temptokena}}}
答案3
我的成绩表包就是为此目的而设计的。它使您可以一次性打印所有练习的答案,按章节或章节选择,或按问题 ID 打印。下面的示例假设每个练习都有答案,但实际上这不是必需的。
你也可以将所有练习及其答案收集到一个单独的文件中(或者每个部分一个文件?),并在需要输入的地方包括选定的练习。这当然仍然意味着可以有选择地打印答案。
\documentclass{book}
\usepackage{exsheets}
\SetupExSheets{
% question numbering: »chapter.question«
% use `ch.se.qu' for »chapter.section.question«
counter-format = ch.qu
}
% Adjust the heading so there's are gap between heading and
% the previous paragraph a littler larger than the default:
\DeclareInstance{exsheets-heading}{block}{default}
{
join = { title[r,B]number[l,B](1ex,0pt) } ,
attach =
{
main[l,vc]title[l,vc](0pt,0pt) ;
main[r,vc]points[l,vc](\marginparsep,0pt)
},
above = \baselineskip-.5ex ,
below = .5ex
}
\usepackage{kantlipsum}
\begin{document}
\chapter{One}\exlabel{chap:one}
\section{One A}
\kant[2]
\begin{question}[ID=one:a]
Question of section one a.
\end{question}
\begin{solution}
Solution to the question one a.
\end{solution}
\section{One B}
\kant[3]
\begin{question}[ID=one:b]
Question of section one b.
\end{question}
\begin{solution}
Solution to the question one b.
\end{solution}
\chapter{Two}\exlabel{chap:two}
\section{Two A}
\kant[4]
\begin{question}[ID=two:a]
Question of section two a.
\end{question}
\begin{solution}
Solution to the question two a.
\end{solution}
\section{Two B}
\kant[5]
\begin{question}[ID=two:b]
Question of section two b.
\end{question}
\begin{solution}
Solution to the question two b.
\end{solution}
\chapter{Selected Exercise Answers}
\printsolutions
% or select by ID:
% \printsolutions[byID={one:a,two:b}]
% or select by chapter:
% \printsolutions[chapter=\exref{chap:two}]
\end{document}
答案4
如果您找不到 LaTeX 软件包来完成您的工作,可以使用 TeX 的 \openout、\write 和 \closeout 命令将您想要的任何内容输出到辅助文件,然后通过在其上运行 \input 将其导入。文件写入功能在 TeXBook 的第 226-228 页中进行了描述。