parbox と usebox では改行が機能しない

parbox と usebox では改行が機能しない

データを savebox (またはその他のストレージ要素) に繰り返し保存したいと思います。最後に、各データポイントをフレームボックスに配置し、次に指定された幅の frambox コンテナーに配置したいと思います。これが私の実装です:

\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}$}}

関連情報