如何在 LaTeX 文档的一部分中制作练习,而在另一部分中选择答案?

如何在 LaTeX 文档的一部分中制作练习,而在另一部分中选择答案?

我怎样才能在 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 页中进行了描述。

相关内容