Latexでテキストを特定のスペースに収める

Latexでテキストを特定のスペースに収める

これはグラフの説明なので、テキストを特定のスペースに収めようとしています。以下のグラフのようなものを作成したいと思います。

特定のスペースにテキストを収める

テキストをそのスペースに収めることは可能ですか? LaTex は自動的にそれを行いますか? パッケージまたはコマンドを使用する必要がありますか?

ありがとう。

答え1

修正された回答(完全に自動化されています):

この修正された回答では、 を呼び出して\constraintext、5 つの引数を渡します。

#1制限されたテキストの高さ

#2制限されたテキスト幅

#3制限するテキストコンテンツ

#4コンテンツの自然な(拡大縮小されていない)幅以上の推測値(大きすぎる値を選択すると、余分な反復処理がいくつか発生するだけです)

#5目的のアスペクト比を満たすために、各反復で自然な幅から減算される長さの正の増分。

前述のように、ボックス幅として\parbox自然な幅 (入力 ) を使用して、スケールなしのボックス (現在のフォント サイズ) が作成されます。アスペクト比がテストされます。十分に大きい値を選択した場合、アスペクト比はターゲット値より低くなります。次に、スケールなしのボックスが で指定された量だけ狭くなり、アスペクト比が再テストされます。アスペクト比は、前回のテストに比べて増加します。このプロセスは、テストされたアスペクト比がターゲット値と等しいかそれを超えるまで再帰的に繰り返されます。#4#4#5

その時点で、ボックスは制約された高さ ( #1) に設定され、幅は制約された幅のままか、わずかに下になります。パディングは、タイプセットの幅が制約された幅と等しくなるように、\parbox一致する で実行されます。\hfill

診断印刷を削除するためにコメントする内容に関するメモを MWE に配置しました。

\documentclass{article}
\usepackage{scalerel}
\usepackage{fp}
\usepackage{lipsum}
\usepackage{stackengine}
\newcount\boxheight
\newcount\boxwidth
\newlength\constrainedwidth
\newsavebox\testbox
\newlength\currentwidth

\newcommand\aspect[1]{%
  \boxheight=\ht#1\relax%
  \boxwidth=\wd#1\relax%
  \FPdiv\testaspect{\the\boxheight}{\the\boxwidth}%
\testaspect\\%                  COMMENT THIS LINE TO REMOVE ASPECT-RATIO PRINTS
}
% TARGET-HEIGHT, TARGET-WIDTH, CONTENT, GUESS>NATURAL-WIDTH, dWIDTH
\newcommand\constraintext[5]{%
  \def\svfboxsep{\the\fboxsep}%
  \setlength\fboxsep{0pt}%
  \setlength\constrainedwidth{#2}%
  \sbox\testbox{\rule{#2}{#1}}%
TARGET ASPECT RATIO\\%          COMMENT THIS LINE TO REMOVE COMMENT
V\\%                            COMMENT THIS LINE TO REMOVE COMMENT
  \aspect{\testbox}%
  \edef\aspectratio{\testaspect}%
  \constrainsize{#1}{\aspectratio}{#3}{#4}{#5}%
  \setlength\fboxsep{\svfboxsep}%
}
\newcommand\constrainsize[5]{%
  \sbox{\testbox}{\fbox{\parbox[b]{#4}{#3}}}%
  \aspect{\testbox}%
  \FPiflt{\testaspect}{#2}%
    \setlength{\currentwidth}{#4}%
    \addtolength{\currentwidth}{-#5}%
    \constrainsize{#1}{#2}{#3}{\currentwidth}{#5}%
  \else
    \setlength\constrainedwidth{#1}%
    \FPdiv\result{1.0}{#2}%
%                               CHANGE \framebox TO \makebox TO REMOVE FRAME
    \framebox[\result\constrainedwidth]{\hfill%
      \scaleto{\parbox[b]{\currentwidth}{#3}}{#1}%
      \hfill%
    }%
  \fi%
}
\parindent 0in
\begin{document}
\constraintext{5in}{2.8in}{\lipsum[1-2]}{3in}{.02in}
\rule[-\fboxsep]{.2ex}{5in}\\
\rule{2.8in}{.2ex}
\clearpage
\constraintext{5in}{2.8in}{\lipsum[3]}{2.25in}{.02in}
\rule[-\fboxsep]{.2ex}{5in}\\
\rule{2.8in}{.2ex}
\end{document}

以下に、入力ストリームのサイズが異なる 2 つの結果を示しますが、どちらも最終ボックスのサイズは同じ (5 インチ x 2.8 インチ) に設定されています。ボックス サイズの正確さを確認するために、ボックスの横と下にルールが設定されています。

診断が表示され、最初にターゲットのアスペクト比が示され、次に各反復でのアスペクト比が示されます。アスペクト比が突然変化した場合は、折り返しのためにタイプセット ボックスに追加のテキスト行が必要になったことを示します。最終的なアスペクト比がターゲットに近いほど、ボックスを制約するために必要な水平方向のパディングが少なくなります。

ここに画像の説明を入力してください

ここに画像の説明を入力してください

元の回答(完全に自動化されていません):

これは完全に自動化されているわけではありませんが、少しの反復で作業は完了します。最初の 2 つのlipsum 段落を高さ 5 インチ、幅 2 インチのボックスに配置するとします。高さ/幅のアスペクト比は 2.5 になります。私はまず、これらの段落をフレーム内に配置し\parbox、(反復は次のとおりです) 便利なマクロを使用してボックスの幅を調整して適切なアスペクト比を実現しました\aspect(この反復フェーズには約 4 回の反復とおそらく 1 分かかりました)。

2.5+/- イプシロンのアスペクト比を実現したら、パッケージ\scaletoの を使用しscalerelてボックスの高さを 5 インチに拡大しました。アスペクト比により、幅は 2 インチになります。元の 10pt タイプセット ボックス (\x) と拡大されたコンパニオンを示します。

\documentclass{article}
\usepackage{scalerel}
\usepackage{fp}
\usepackage{lipsum}
\newcount\boxheight
\newcount\boxwidth
\newcommand\aspect[1]{%
  \boxheight=\ht#1\relax%
  \boxwidth=\wd#1\relax%
  \FPdiv\result{\the\boxheight}{\the\boxwidth}\result%
}
\begin{document}
\newsavebox\x
\sbox{\x}{\fbox{\parbox[b]{2.42in}{\lipsum[1-2]}}}
\aspect{\x}

\usebox{\x}
\scaleto{\usebox{\x}}{5in}    
\end{document}

ここに画像の説明を入力してください

また、あなたの特定のサンプル画像のレイアウトに関しては、アスペクト比を目標の 1.75 に再評価し (段落サイズは 5 インチ x 20/7 インチになります)、次のようになりました。ここで、 は に\rule置き換えられます\includegraphics。もちろん、5 インチの高さは単なる推測ですが、修正可能です。

\documentclass{article}
\usepackage{scalerel}
\usepackage{fp}
\usepackage{lipsum}
\usepackage[oldsyntax]{stackengine}
\newcount\boxheight
\newcount\boxwidth
\newcommand\aspect[1]{%
  \boxheight=\ht#1\relax%
  \boxwidth=\wd#1\relax%
  \FPdiv\result{\the\boxheight}{\the\boxwidth}\result%
}
\begin{document}
\newsavebox\x
\sbox{\x}{\fbox{\parbox[b]{2.84in}{\lipsum[1-2]}}}
%\aspect{\x}

\def\hgp{\hspace{.1in}}
\def\plotA{\protect\rule{1.36in}{0.66in}}
\def\plotB{\protect\rule{1.36in}{1.36in}}
\def\plotC{\protect\rule{1.36in}{1.36in}}
\def\plotD{\protect\rule{1.36in}{1.36in}}
\def\plotE{\protect\rule{1.36in}{1.36in}}
\def\plotF{\protect\rule{1.36in}{1.36in}\hgp}
\def\plotG{\protect\rule{1.36in}{1.36in}}

\def\stackalignment{l}
\Sstackgap=.1in
\Shortstack{{\plotA} {\plotB} {\plotC} {\plotD} {\plotE}}\hgp%
\stackon{\plotF \plotG}{\scaleto{\usebox{\x}}{5in}}

\end{document}

ここに画像の説明を入力してください

ps 私は V2.0 スタックエンジンを使用していますが、まだお持ちでないかもしれません。アップグレードできるようになるまで、そして 2 番目の MWE を動作させるには、[oldsyntax]パッケージ オプションを削除してください。

答え2

\tcolorboxfittingコマンドを使用してライブラリをインクルードします\tcboxfit。指定された幅と高さのボックス内にコンテンツが収まります。

次にいくつか例を挙げます。

\documentclass{article}
\usepackage[most]{tcolorbox}
\usepackage{lipsum}
\usepackage{lmodern}

\tcbset{colframe=blue!50!black,colback=green!10!white,
boxsep=0pt,top=1mm,bottom=1mm,left=1mm,right=1mm,
nobeforeafter, arc=0pt, outer arc=0pt}

\begin{document}

\lipsum[1]

\noindent\tcboxfit[width=.5\linewidth,height=6cm]{\lipsum[1]}
\hfill
\tcboxfit[width=.45\linewidth, height=4cm]{\lipsum[1]}

\noindent\tcboxfit[width=\linewidth, height=2cm]{\lipsum[1]}

\end{document}

ここに画像の説明を入力してください

関連情報