如何在考试文件中包装图形?

如何在考试文件中包装图形?

我可以在 ARTICLE 中换行,但不能在 EXAM 中换行。如何在 EXAM 中换行?(问题补充 - 如果您是 LaTeX 大师 - 哪个软件包最合适且最容易做这种事情?)

我可以将图形包装在文章文档中

使用此代码

\documentclass[12pt]{article}
\usepackage{graphicx,wrapfig,lipsum}
\usepackage[onehalfspacing]{setspace}
\usepackage{mwe}

\begin{document}
%\begin{questions}
    \begin{wrapfigure}{r}{.3\linewidth}
    \centering
    \includegraphics[width=\linewidth]{example-image-a.png}
    \caption{This is A}
\end{wrapfigure}
Hello, I want to wrap this figure in exam
\lipsum[2]\lipsum[1]
%\end{questions}
\end{document}

在此处输入图片描述

但我想在考试文档中包装图像,并且此代码没有提供包装的图形:

\documentclass[12pt]{exam}
\usepackage{graphicx,wrapfig,lipsum}
\usepackage[onehalfspacing]{setspace}
\usepackage{mwe}

\begin{document}
\begin{questions}
\begin{wrapfigure}{r}{.3\linewidth}
    \centering
    \includegraphics[width=\linewidth]{example-image-a.png}
    \caption{This is A}
\end{wrapfigure}
\question Hello, I want to wrap this figure in exam
\lipsum[2]\lipsum[1]

\end{questions}
\end{document}

在此处输入图片描述

**

已编辑(2019/02/24)在尝试 Skillmon 解决方案后,我在问题中的列表(枚举)方面遇到了新问题

**

这就是问题 在此处输入图片描述

使用代码(仅在带有图形的问题中添加 itemize)

        \documentclass[12pt]{exam}
        \usepackage{graphicx,wrapfig,lipsum}
        \input{insbox}
        \usepackage{capt-of}
        \usepackage[onehalfspacing]{setspace}
        \usepackage{mwe}

        \usepackage{etoolbox}

        \makeatletter
        %% Stealing some code from exam:
        \def\mypointshandling
          {%>>>
            \if@bonus
              \def\padded@point@block{%
            \begingroup
              \@placepointstrue
              \bonuspoint@block
            \endgroup
              }%
            \else
              \def\padded@point@block{%
            \begingroup
              \@placepointstrue
              \point@block
            \endgroup
              }%
            \fi
            \if@pointsdropped
            \else
              \if@bonus
            \if@bonusqformat
              \ifx\ques@ref\@queslevel
              \else
                \setup@point@toks
              \fi
            \else
              \setup@point@toks
            \fi
              \else
            \if@qformat
              \ifx\ques@ref\@queslevel
              \else
                \setup@point@toks
              \fi
            \else
              \setup@point@toks
            \fi
              \fi
            \fi
            \global \MyIfPointsfalse
          }%<<<
        \newif\ifMyIfPoints
        \protected\def\questionInsbox
          {%
            \@ifnextchar[\questionInsbox@a{\questionInsbox@a[]}%
          }
        \protected\long\def\questionInsbox@a[#1]#2#3%
          {%
            \@ifnextchar[{\questionInsbox@b{#1}{#2}{#3}}
              {\questionInsbox@b{#1}{#2}{#3}[0]}
          }
        \long\def\questionInsbox@b#1#2#3[#4]%
          {%
            \apptocmd\@itemlabel{\hskip\leftmargin}{}{}%
            \def\makelabel##1{\hss\llap{##1}}%
            \if\relax\detokenize{#1}\relax
              \question
            \else
              \global\MyIfPointstrue
              \patchcmd\@readpoints{\global\@placepointstrue}{\relax}{}{}%
              \question[#1]%
              \patchcmd\@readpoints{\relax}{\global\@placepointstrue}{}{}%
            \fi
            \patchcmd\@itemlabel{\hskip\leftmargin}{}{}{}%
            \let\makelabel\@mklab
            \mbox{}%
            \vspace*{-\baselineskip}%
            \setlength{\leftskip}{\leftmargin}%
            \InsertBoxR{#2}{\hskip-\leftmargin#3\hskip\leftmargin}[#4]%
            \ifMyIfPoints
              \mypointshandling
            \fi
            \the\point@toks
            \ignorespaces
          }
        \makeatother

        \begin{document}
        \begin{questions}
          \question Jei you
          \questionInsbox[5]{0}
            {%
              \parbox[t]{.3\linewidth}
            {%
              \centering
              \includegraphics[width=\linewidth]{example-image-a.png}
              \captionof{figure}{This is A}%
            }%
            }[1]
        Hello, I want to wrap this figure in exam, and you should choose the rigth answer:
        \begin{enumerate}
          \item \lipsum[1]  
          \item \lipsum[1]
        \end{enumerate}

        \question Another
        \end{questions}
        \end{document} 

该解决方案不是最好的,但是......我即时输入的是:

\question See figure and answer, please:    
\begin{enumerate}
\begin{multicols}{2}  
\item answer 1
\item ans 2
\item ans 3
{\centering
    \begingroup
                \centering
                \includegraphics[width=1.00\linewidth]{{example-image-a.png}
                \vspace{-0.3cm}
                \captionof{figure}{}
                \label{fig:croquis-rectangulo-ecuacions.png}
            \endgroup}
  \end{multicols}
  \item ans afeter fig
  \end{enumerate}

编辑(2019/02/25)在 Skillmon 的编辑 3 之后 我很佩服你对 LaTeX 编程的了解。太棒了!

如果解决方案适用于普通文本,则非常完美,但是当您使用列表(枚举、逐项列出……)时,问题仍然存在。在阅读 Skillmon 的最新评论(2019/02/24)后,我决定在普通文本中模拟列表。使用 \ a) 答案 1 答案 1 答案 1 答案 1 答案 1 答案 1 答案 1 答案 1 答案 1 答案 1\ b) 答案 2 答案 2 答案 2 答案 2 答案 2 答案 2 答案 2 答案 2 答案 2 答案 2\

LaTeX 非常美丽,非常复杂!!

等待将来的考试课上出现这个选项(我很乐观,是的!!:-))...我有时会使用您的解决方案。

据我所知,只有在页面底部才会失败,并且当您使用一些 \questionInsboxL[5]{2} 且问题之间接近空白页时。

感谢您的所有解决方案和努力!

在此处输入图片描述

谢谢你,SKILLMON

答案1

wrapfig不适用于列表,它questions只是列表的另一个版本。下面是快速而粗略的重新实现https://tex.stackexchange.com/a/453624/117050使用enumerate类似列表而不是使用itemize。它insbox就像@Bernard的答案一样使用,但不需要手动段落。它只实现了在一个问题内包装的代码,而不是在下一个问题内包装的代码。

编辑:现在它应该支持exam积分系统,但我还没有彻底测试过。如果它不起作用,你可能会回来抱怨。

编辑2:简化了界面,使其更像 的界面\InsertBoxR,新宏的名称为\questionInsboxR,它接受一个可选参数、两个强制参数和第二个可选参数。第一个可选参数类似于 的参数,两个强制参数和以下可选参数\question类似于 的参数\InsertBoxR

编辑3:添加并修复了一个环境内\questionInsboxL多种用途的行为。\questionInsboxL/Rquestions

\documentclass[12pt]{exam}
\usepackage{graphicx,wrapfig,lipsum}
\input{insbox}
\usepackage{capt-of}
\usepackage[onehalfspacing]{setspace}
\usepackage{mwe}

\usepackage{etoolbox}

\makeatletter
%% Stealing some code from exam:
\def\mypointshandling
  {%>>>
    \if@bonus
      \def\padded@point@block{%
        \begingroup
          \@placepointstrue
          \bonuspoint@block
        \endgroup
      }%
    \else
      \def\padded@point@block{%
        \begingroup
          \@placepointstrue
          \point@block
        \endgroup
      }%
    \fi
    \if@pointsdropped
    \else
      \if@bonus
        \if@bonusqformat
          \ifx\ques@ref\@queslevel
          \else
            \setup@point@toks
          \fi
        \else
          \setup@point@toks
        \fi
      \else
        \if@qformat
          \ifx\ques@ref\@queslevel
          \else
            \setup@point@toks
          \fi
        \else
          \setup@point@toks
        \fi
      \fi
    \fi
    \global \MyIfPointsfalse
  }%<<<
\protected\long\def\myOargparse#1#2%>>>
  {%
    \@ifnextchar[{\myOargparse@{#2}}{#2{#1}}%
  }%<<<
\long\def\myOargparse@#1[#2]%>>>
  {%
    #1{#2}%
  }%<<<
\def\q@mark{\q@mark}
\newif\ifMyIfPoints
\newif\if@notfirstins
\protected\def\questionInsboxL%>>>
  {%
    \myOargparse{\q@mark}{\questionInsbox@a\InsertBoxL}%
  }%<<<
\protected\def\questionInsboxR%>>>
  {%
    \myOargparse{\q@mark}{\questionInsbox@a\InsertBoxR}%
  }%<<<
\protected\long\def\questionInsbox@a#1#2#3#4%>>>
  {%
    \myOargparse{0}{\questionInsbox@b{#1}{#2}{#3}{#4}}%
  }%<<<
\protected\long\def\questionInsbox@b#1#2#3#4#5%>>>
  {%
    \if@notfirstins
    \else
      \def\makelabel##1{\hss\llap{##1}}%
      \apptocmd\@itemlabel{\hskip\leftmargin}{}{}%
    \fi
    \ifx\q@mark#2%
      \question
    \else
      \global\MyIfPointstrue
      \patchcmd\@readpoints{\global\@placepointstrue}{\relax}{}{}%
      \question[{#2}]%
      \patchcmd\@readpoints{\relax}{\global\@placepointstrue}{}{}%
    \fi
    \if@notfirstins
    \else
      \patchcmd\@itemlabel{\hskip\leftmargin}{}{}{}%
      \let\makelabel\@mklab
      \@notfirstinstrue
    \fi
    \mbox{}%
    \vspace*{-\baselineskip}%
    \setlength{\leftskip}{\leftmargin}%
    \ifx\InsertBoxR#1%
      #1{#3}{\hskip-\leftmargin#4\hskip\leftmargin}[{#5}]%
    \else
      #1{\numexpr#3+1\relax}{#4}[{#5}]\par\hspace{\itemindent}%
    \fi
    \ifMyIfPoints
      \mypointshandling
    \fi
    \the\point@toks
    \ignorespaces
  }%<<<
\makeatother

\begin{document}
\begin{questions}
  \question[5]\lipsum[2]
  \questionInsboxR[5]{0}
    {%
      \parbox[t]{.3\linewidth}
        {%
          \centering
          \includegraphics[width=\linewidth]{example-image-a.png}%
          \captionof{figure}{This is A}%
        }%
    }[1]
    Hello, I want to wrap this figure in exam
    \lipsum[1]
  \questionInsboxL[5]{2}
    {%
      \parbox[t]{.3\linewidth}
        {%
          \centering
          \includegraphics[width=\linewidth]{example-image-a.png}%
          \captionof{figure}{This is A}%
        }%
    }[1]
    Hello, I want to wrap this figure in exam
    \lipsum[1]
\end{questions}
\end{document}

在此处输入图片描述

答案2

这里有一个使用captionTeXinsbox宏包的解决方案。它定义了一个\InsertBoxR命令,插入到段落的最开始,该命令有两个强制参数:插入框之前未触及的行数,以及插入的框本身。此外,如果 TeX 对所需较短行数的计算有误,它会接受您想要的补充较短行数作为可选参数。

\documentclass[12pt]{exam}
\usepackage{graphicx,wrapfig,lipsum}
\usepackage[onehalfspacing]{setspace}
\usepackage{mwe}
\usepackage{caption}
\input{insbox}

\begin{document}

\begin{questions}
\question
Hello, I want to wrap this figure in exam. \par
\InsertBoxR {0}{\parbox{0.3\linewidth}{\includegraphics[width=\linewidth]{example-image-a.png}\captionof{figure}{This is A}}}[3]
\lipsum[2]\lipsum[1]
\end{questions}

\end{document} 

在此处输入图片描述

相关内容