열거 환경을 사용하여 목록에서 짧은 답변을 저장하기 위해 몇 가지 새로운 환경과 명령을 작성하려고 합니다. 아이디어는 메모리에 저장된 목록에 대한 참조를 사용하여 첫 번째 및 두 번째 수준을 저장하는 것입니다.
enumitem
, multicol
, 및 패키지 pgffor
를 사용하고 있습니다 .tcolorbox
xparse
저는 짧은 답변을 저장할 수 있도록 내부에 정의된 명령이 있는 두 개의 새로운 환경을 만들었고 열거 항목에 키 쌍을 추가했다고 설명했습니다.
\NewDocumentEnvironment{saveanswer} whit \answi
\NewDocumentEnvironment{saveansweri} whit \answii
\SetEnumitemKey{columns}{before=\begin{multicols}{#1},after=\end{multicols}}%
\SetEnumitemKey{savekey}{before=\begin{saveanswer}{#1},after=\end{saveanswer}}%
\SetEnumitemKey{ansref}{before=\begin{saveansweri}{#1},after=\end{saveansweri}}%
여기서 나의 딜레마가 시작됩니다. 열거 항목 키를 사용하면 마지막 요소의 목록 정렬이 손실되고 모든 열거 환경(활성화된 키 유무에 관계없이)에 영향을 줍니다.
열거 항목 키에 주석을 달고 "saveanswer" 내에 열거 환경을 캡슐화하면 내가 만든 항목이 문제를 부분적으로 해결하지만 여전히 다른 열거 환경에 영향을 미칩니다.
두 경우 모두 실패하고, 또한 항목을 목록에 올바르게 유지하기 위해 foreach 루프를 실행할 수 없습니다. 나는 다음과 같이 보이고 싶습니다 :
나는 이것에 조금 길을 잃었습니다. 나는 읽었습니다.NewDocumentEnvironment와 열거 간의 충돌어쩌면 내가 찾고 있는 것을 얻는 방법이 옳지 않을 수도 있고 다르게 이루어져야 할 수도 있습니다. 감사합니다: MWE:
% !file: forum.tex
% arara: pdflatex
% arara: clean: { files:[forum.aux, forum.log] }
\documentclass{article}
\usepackage{enumitem}
\usepackage{multicol}
\usepackage{pgffor}
\usepackage{tcolorbox}
\tcbuselibrary{many}
\pagestyle{empty}
% Set key for multicols in enumitem
\SetEnumitemKey{columns}{before=\begin{multicols}{#1},after=\end{multicols}}%
\SetEnumitemKey{savekey}{before=\begin{saveanswer}{#1},after=\end{saveanswer}}%
\SetEnumitemKey{ansref}{before=\begin{saveansweri}{#1},after=\end{saveansweri}}%
% Some definition
\newtheorem{theorem}{Theorem}
\newtheorem{exercise}[theorem]{Exercise}
% Adapted from https://tex.stackexchange.com/a/364763/7832
\ExplSyntaxOn
% Reporter macro, is expandable
\cs_new:Npn \reportnumberofseqitems #1{%
\seq_count:c {l_bcp_data_#1_seq}%
}
\NewDocumentCommand{\storedata}{mm}
{
\bcp_store_data:nn { #1 } { #2 }
}
\NewDocumentCommand{\appenddata}{+m+m}
{
\bcp_append_data:nn { #1 } { #2 }
}
\DeclareExpandableDocumentCommand{\getdata}{O{1}m}
{
\bcp_get_data:nn { #1 } { #2 }
}
\cs_new_protected:Npn \bcp_store_data:nn #1 #2
{
% create the sequence if it doesn't exist or clear it if it exists
\seq_if_exist:cTF { l_bcp_data_#1_seq }
{ \seq_new:c { l_bcp_data_#1_seq } }
{ \seq_gclear:c { l_bcp_data_#1_seq } }
% append the items
\__bcp_append_data:nn { #1 } { #2 }
}
\cs_new_protected:Npn \bcp_append_data:nn #1 #2
{
% create the sequence if it doesn't exist, do nothing if it exists
\seq_if_exist:cF { l_bcp_data_#1_seq }
{ \seq_new:c { l_bcp_data_#1_seq } }
% append the items
\__bcp_append_data:nn { #1 } { #2 }
}
\cs_new_protected:Npn \__bcp_append_data:nn #1 #2
{
% append items one at a time
\tl_map_inline:nn { #2 }
{
\seq_gput_right:cn { l_bcp_data_#1_seq } { ##1 }
}
}
\cs_new:Npn \bcp_get_data:nn #1 #2
{
% retrieve the requested item
\seq_item:cn { l_bcp_data_#2_seq } { #1 }
}
% Save answer in first level answi
\NewDocumentEnvironment{saveanswer}{m}{%
\NewDocumentCommand\answi{m}{%,
\appenddata{#1}{{##1}}%
}% close \answi
}{%
}% close saveanswer
% Save answer in second level answii
\newcounter{myNo}
\NewDocumentEnvironment{saveansweri}{m}{%
\stepcounter{myNo}
\NewDocumentCommand\answii{m}{%,
\appenddata{#1:\themyNo}{{##1}}%
}% close \answii
}{%
\appenddata{#1}{{\begin{enumerate}\space%
\foreach \x in {1,...,\reportnumberofseqitems{#1:\themyNo}}{%
\item \space \getdata[\x]{#1:\themyNo} \space%
} % close foreach
\space \end{enumerate}}} % close appendata
}% close saveansweri
\ExplSyntaxOff
% [#1] : pass to tcolorbox
% {#2} : title
% {#3} : list ref
% [#4] : columns
\DeclareTotalTColorBox{\showans}{O{} m m O{4}}
{ colback=white,size=small,top=0mm,bottom=1.5mm, left=0mm,width=\columnwidth,title filled,%
fontupper=\small,fonttitle=\small\sffamily,%
adjusted title={#2},center title,#1}
{%
\begin{enumerate}[columns=#4,leftmargin=15pt,labelsep=3pt,font=\footnotesize,nosep,widest=25,]%
\small
\setlength{\columnsep}{0pt}
\foreach \x in {1,...,\reportnumberofseqitems{#3}} {
\item \getdata[\x]{#3}%
}
\end{enumerate}
}%
\begin{document}
\section{It looks like this}
\subsection{Exercices}
\begin{enumerate}[savekey=test1]
\setenumerate{labelsep=5pt, leftmargin=1cm, itemsep=0pt,widest=80}%
\item True False
\begin{enumerate}[ansref=test1]
\item $2\alpha+2\delta=90^{\circ}$ \answii{True}
\item $\angle EDF=45^{\circ}$ \answii{False}
\end{enumerate}
\item Factor $x^{2}-2x+1$ \answi{$\left(x-1\right)^{2}$}
\item Factor$3x+3y+3z$ \answi{$3(x+y+z)$}
\item True False
\begin{enumerate}[ansref=test1]
\item $2\alpha+2\delta=90^{\circ}$ \answii{False}
\item $\alpha=\delta$ \answii{True}
\item $\alpha=\delta$ \answii{True}
\end{enumerate}
\end{enumerate}
\subsection{answers}
\showans{Exercices 1}{test1}[2]
\end{document}
답변1
나는 자동으로 레벨을 낮추고 올리고 하나의 항목 에 enumerate
저장하여 다른 전략을 적용하고 있습니다.\begin{enumerate}
\end{enumerate}
하나의목록, 전역 변수를 사용하여 현재 목록 ID를 검색합니다 \prop
.
% !file: forum.tex
% arara: pdflatex
% arara: clean: { files:[forum.aux, forum.log] }
\documentclass{article}
\usepackage{enumitem}
\usepackage{multicol}
\usepackage{pgffor}
\usepackage[many]{tcolorbox}
\pagestyle{empty}
% Set key for multicols in enumitem
\SetEnumitemKey{columns}{before=\begin{multicols}{#1},after=\end{multicols}}%
\SetEnumitemKey{savekey}{before={\storecurrentid{#1}\begin{saveanswer}{#1}},after=\end{saveanswer}}%
% Some definition
\newtheorem{theorem}{Theorem}
\newtheorem{exercise}[theorem]{Exercise}
% Adapted from https://tex.stackexchange.com/a/364763/7832
\ExplSyntaxOn
\prop_new:N \g_bpc_admin_prop
\cs_new:Npn \storecurrentid #1{%
\prop_gput:Nnn \g_bpc_admin_prop {current-id} {#1}
}
\cs_new:Npn \retrievecurrentid {%
\prop_item:Nn \g_bpc_admin_prop {current-id}
}
\NewDocumentEnvironment{saveanswer}{m}{%
\setlist[enumerate,1]{labelsep=5pt, leftmargin=1cm, itemsep=0pt,widest=80}%
\setlist[enumerate,2]{before={\stepdownlevel},after={\stepuplevel},labelsep=5pt, leftmargin=0.6cm, itemsep=0pt,widest=80}
\seq_if_exist:cF { l_bcp_data_#1_seq }{%
\seq_new:c { l_bcp_data_#1_seq }
}
\leavevmode
}{%
%
}% close saveanswer
\NewDocumentCommand{\answeris}{+m}{%
\seq_gput_right:cn { l_bcp_data_ \retrievecurrentid _seq }{\item #1}
\par
}
\newcommand{\stepdownlevel}{%
% Must start a new item with \begin{enumerate} on answer ...
\seq_gput_right:cn {l_bcp_data_ \retrievecurrentid _seq} {\item \begin{enumerate}}
}
\newcommand{\stepuplevel}{%
% Close current enumerate level
\seq_gput_right:cn {l_bcp_data_ \retrievecurrentid _seq} {\end{enumerate}}
}
\cs_new:Npn \displayseqcontent #1#2 {%
\seq_if_empty:cF { l_bcp_data_#1_seq } {%
\seq_log:c { l_bcp_data_#1_seq }
\setlist[enumerate,2]{before={},after={},labelsep=5pt, leftmargin=0.6cm, itemsep=0pt,widest=80}
\begin{enumerate}[#2]
\small
\setlength{\columnsep}{0pt}
\seq_map_inline:cn { l_bcp_data_#1_seq } {%
##1%
}
\end{enumerate}
}
}
\ExplSyntaxOff
% [#1] : pass to tcolorbox
% {#2} : title
% {#3} : list ref
% [#4] : columns
\DeclareTotalTColorBox{\showans}{O{} m m O{4}}
{ colback=white,size=small,top=0mm,bottom=1.5mm, left=0mm,width=\columnwidth,title filled,%
fontupper=\small,fonttitle=\small\sffamily,%
adjusted title={#2},center title,#1}
{%
\displayseqcontent{#3}{columns=#4,leftmargin=15pt,labelsep=3pt,font=\footnotesize,nosep,widest=25}
}%
% Set the list properties for level 1 and 2
%\setlist[enumerate,1]{labelsep=5pt, leftmargin=1cm, itemsep=0pt,widest=80}%
%\setlist[enumerate,2]{before={\stepdownlevel},after={\typeout{stepping up for \retrievecurrentid}\stepuplevel},labelsep=5pt, leftmargin=0.6cm, itemsep=0pt,widest=80}%
\begin{document}
\section{It looks like this}
\subsection{Exercices}
\begin{enumerate}[savekey=test1]
\item True False
\begin{enumerate}
\item $2\alpha+2\delta=90^{\circ}$ \answeris{True}
\item $\angle EDF=45^{\circ}$ \answeris{False}
\end{enumerate}
\item Factor $x^{2}-2x+1$ \answeris{$\left(x-1\right)^{2}$}
\item Factor $3x+3y+3z$ \answeris{$3(x+y+z)$}
\item True False
\begin{enumerate}
\item $2\alpha+2\delta=90^{\circ}$ \answeris{False}
\item $\alpha=\delta$ \answeris{True}
\item $\alpha > \delta$ \answeris{False}
\item \LaTeX2e\ is cool? \answeris{Very True!}
\end{enumerate}
\end{enumerate}
\begin{enumerate}[savekey=test2]
\item True False
\begin{enumerate}
\item $2\alpha+2\delta=90^{\circ}$ \answeris{False}
\item $\alpha=\delta$ \answeris{True}
\item $\alpha > \delta$ \answeris{False}
\item \LaTeX2e\ is cool? \answeris{Very True!}
\end{enumerate}
\item True False
\begin{enumerate}
\item $2\alpha+2\delta=90^{\circ}$ \answeris{True}
\item $\angle EDF=45^{\circ}$ \answeris{False}
\end{enumerate}
\item Factor $x^{2}-2x+1$ \answeris{$\left(x-1\right)^{2}$}
\item Factor $3x+3y+3z$ \answeris{$3(x+y+z)$}
\end{enumerate}
\subsection{answers}
\showans[colback=yellow!30!white]{Exercices 1}{test1}[2]
\showans[colback=yellow!30!white]{Exercices 2}{test2}[2]
\showans[colback=yellow!70!blue]{Exercices 1 again}{test1}[2]
\end{document}