Newline이 parbox 및 usebox와 작동하지 않습니다.

Newline이 parbox 및 usebox와 작동하지 않습니다.

반복적으로 데이터를 저장 상자(또는 다른 저장 요소)에 저장하고 싶습니다. 마지막에는 각 데이터 포인트를 프레임박스에 넣은 다음 주어진 너비의 프레임박스 컨테이너에 넣고 싶습니다. 내 구현은 다음과 같습니다.

\documentclass{article}

\newsavebox{\foo}
\newcommand{\savedata}[1]{\savebox{\foo}{\usebox{\foo} \fbox{#1}}}
\newcommand{\printdata}{\framebox{\parbox{4cm}{\usebox{\foo}}}}
\begin{document}
The desired usage:
\savedata{This is a box}
\savedata{This is another box}
\savedata{This is third box}
\printdata
\\
The desired output:
\framebox{\parbox{4cm}{
  \fbox{This is a box} 
  \fbox{This is another box} 
  \fbox{This is third box}}}
\end{document}

출력:
산출 표시된 대로 컨테이너는 프로그래밍 방식 구현을 사용할 때 내부 프레임박스를 래핑하지 않습니다. 뭐가 잘못 되었 니?

답변1

줄을 짧게 하려면 Raggedright를 사용하고 줄 바꿈을 허용하려면 저장된 데이터를 언박싱해야 합니다.

\documentclass{article}

\newsavebox{\foo}
\newcommand{\savedata}[1]{\savebox{\foo}{\ifvoid\foo\else\unhbox\foo{} \fi\fbox{#1}}}
\newcommand{\printdata}{\framebox{\parbox{4cm}{\raggedright\unhbox\foo}}}
\begin{document}
The desired usage:
\savedata{This is a box}
\savedata{This is another box}
\printdata

The desired output:
\framebox{\parbox{4cm}{\raggedright\fbox{This is a box} \fbox{This is another box}}}
\end{document}

답변2

상자를 사용하고 싶은지 잘 모르겠습니다.

\documentclass{article}

\usepackage{etoolbox}
\newcommand{\cleardata}{\renewcommand*{\saveddata}{}}
\newcommand*\saveddata{} % initialize

\newcommand{\savedata}[1]{%
  \unskip
  \ifx\saveddata\empty
  \else
    \appto{\saveddata}{\\}
  \fi
  \appto{\saveddata}{\fbox{#1}}\ignorespaces
}
\newcommand{\printdata}[1][4cm]{\fbox{\parbox{#1}{\raggedright\saveddata}}}

\begin{document}
The desired usage:
\savedata{This is a box}
\savedata{This is another box}
\savedata{This is third box}
\printdata

The desired output:
\framebox{\parbox{4cm}{
  \fbox{This is a box} \\
  \fbox{This is another box} \\
  \fbox{This is third box}}}

With optional argument: \printdata[6cm]
\end{document}

이 명령은 \cleardata새 상자를 추가하는 메커니즘을 재설정합니다.

여기에 이미지 설명을 입력하세요

여기서는 편의를 위해 사용했습니다 etoolbox. 자신을 정의하여 이를 방지할 수 있습니다 \appto.

\makeatletter
\providecommand\appto[2]{%
  \ifx#1\@undefined
    \def#1{#2}%
  \else
    \expandafter\def\expandafter#1\expandafter{#1#2}%
  \fi
}
\makeatother

답변3

완성된 상자의 너비가 4cm가 필요합니까? 이 너비를 내부에서 가장 넓은 상자의 너비로 설정하는 것이 더 좋지 않습니까? 그렇다면 다음을 사용할 수 있습니다.

\newbox\foo
\def\savedata#1{\setbox\foo=\vbox{\unvbox\foo \hbox{\fbox{#1}}\kern1pt}\ignorespaces}
\def\printdata{\framebox{$\vcenter{\box\foo\kern-1pt}$}}

관련 정보