縮小したTikzを文章に回り込ませる方法

縮小したTikzを文章に回り込ませる方法

- Tatsuya Ogawa の投稿
返信数: 8

初めての投稿になります。失礼な点があればご指摘いただけると幸いです。

Cloud LaTeXにて編集をしています。コンパイラはupLaTeXです。またTeX Live 2021バージョンです。

プリアンブルは以下の設定になっています。

\documentclass[paper=a4, dvipdfmx, fleqn, uplatex]{jlreq}


\usepackage{amsmath, amssymb,ascmac}

\usepackage{bxpapersize}

\usepackage{tikz}

\usepackage{multicol}

\usepackage[top=18truemm,bottom=20truemm,left=18truemm,right=18truemm]{geometry}

\usepackage{okumacro}

\usepackage{tcolorbox}

\usepackage{graphicx,xcolor}

\usepackage{ceo}

\usepackage{wrapfig}


\newcounter{nombre}[subsection]


\tcbuselibrary{skins}


\usetikzlibrary{patterns}


\renewcommand{\labelenumi}{(\theenumi)\ }

\newcommand{\ctext}[1]{\raise0.2ex\hbox{\textcircled{\scriptsize{#1}}}}


\newtcolorbox{mysimplebox}[1]{%

 colframe=black, colback=white,

 coltitle=black, colbacktitle=white,

 boxrule=0.8pt, arc=0mm,

 fonttitle=\sffamily\bfseries,

 enhanced,

 attach boxed title to top left={xshift=3mm,yshift=-4mm},

 boxed title style={frame hidden},

 title=#1}

このmysimplebox内にてグラフを右に置き,回り込むように文章を書いています。Tikzにてグラフを書いているのですが,少し大きいのでscaleboxで縮小しました。すると画像のように回り込み範囲が変わらないままの縮小になってしまいました。コマンドは以下のように入力しています。

\begin{mysimplebox}{\textbf{問題\refstepcounter{nombre}\thenombre}}\vspace{0.2cm}

\begin{wrapfigure}{r}[0pt]{0.5\textwidth}

\scalebox{0.8}{

%目盛り付き座標軸

\begin{tikzpicture}

\draw[thick, ->] (-3,0) -- (3,0) node [below] {$x$};%x軸

\draw[thick, ->] (0,-1) -- (0,5) node [left] {$y$};%y軸

\draw[help lines] (-2.8,-0.8) grid (2.8,4.8);

\draw[very thick] (-2.2,4.84) parabola bend (0,0) (2.2,4.84);%放物線

\node at (0,0) [anchor=north east] {O};

\foreach \x in {-2,-1,1,2}

   \draw (\x cm,.2) -- (\x cm,0) node[anchor=north] {$\x$};

\foreach \y in {1,2,3,4}

   \draw (.2,\y cm) -- (0,\y cm) node[anchor=east] {$\y$};

\end{tikzpicture}

}

\end{wrapfigure}

$y=x^2$の$x$と$y$の関係をもとにして,$x$と$y$の値の組を座標とする点を平面座標に書き入れる。

さらに,$x$の値を0.5おきに増やしながら$y$との値の組を座標とする点や,0.1おきに増やした場合の座標も書き入れていくと,右図のような滑らかな曲線になっていくことが予想される。\\

この曲線が関数$y=ax^2$のグラフである。\\

関数$y=ax^2$のグラフには次のような特徴がある。

\end{mysimplebox}\vspace{0.2cm}


\noindent

できる限り文章が書けるように,縮小に合わせて回り込み範囲も変えることはできるのでしょうか?

添付 スクリーンショット 2022-09-29 15.49.47.png
Tatsuya Ogawa への返信

Re: 縮小したTikzを文章に回り込ませる方法

- 和田 勇 の投稿

質問を「図の幅を wrapfigure の width に指定できるか」と解釈して

\newsavebox{\mybox} \savebox{\mybox}{...} を使って目的の図を仮組版します。

 \newsavebox{\mybox}
 \savebox{\mybox}{
   \scalebox{0.8}{
     \begin{tikzpicture}
       図のコマンド
     \end{tikzpicture}
   }
 }

これにより \wd\mybox で幅が、取得できますので、これを wrapfigure のパラメータに指定します。

 \newdimen\myboxwd
 \myboxwd=\wd\mybox% TiKZ の図版の幅

\usebox{\mybox} で実際に組版します。

 \begin{mysimplebox}
   {\textbf{問題\refstepcounter{nombre}\thenombre}}
   \vspace{0.2cm}
   \begin{wrapfigure}{r}[0pt]{\myboxwd}%% ここで幅を指定
     \usebox{\mybox}%% 仮組版したものを利用する
   \end{wrapfigure}
   説明文
   \\%% 必要に応じて
 \end{mysimplebox}

試しに行ったところ、提供された情報では、図の高さ分に見合う説明文の量が少ないので、 図が枠線からはみ出てしまいます。十二分な量の説明文があれば適宜回り込んではくれます。

組版してはみ出ていたらコメントに書いたように \ をいくつか入れるという対処が手っ取り早いですが ...

これを自動で対処するには、試行してはいないのですが、高さの制御もする必要があると思います。

高さ情報は \ht\mybox で得られますので、 説明文を \textwidth-\myboxwd の幅で仮組版し、 それぞれの高さの大きい方を tclorebox の height バラメータに指定すれば良いかとおもいます。

なお、説明文の方は回り込みがあるので \usebox のは使わない様にするとおもいます。

和田 勇 への返信

Re: 縮小したTikzを文章に回り込ませる方法

- Tatsuya Ogawa の投稿
返信ありがとうございます!
\newsaveboxも\useboxも初めましてなので,また自分で色々と調べて試してみたいと思います。
取り急ぎお礼まで...
Tatsuya Ogawa への返信

Re: 縮小したTikzを文章に回り込ませる方法

- 北見 けん の投稿
そもそも回り込み範囲は自動で決まるのではなくて、
\begin{wrapfigure}{r}[0pt]{0.5\textwidth}
のところで「0.5\textwidth」と明示的に指定しているようです。
これは図のために確保する幅を本文幅の半分にせよという指定です。
この部分をもっと小さい値にすれば、それに応じて文章の幅のほうは長くなります。
ここの指定はご自分で書いたものではないのですか?

和田さんの方法は、
ここに指定する長さを \myboxwd というレジスタにいったん求めておく方法ですね。
北見 けん への返信

Re: 縮小したTikzを文章に回り込ませる方法

- 和田 勇 の投稿
時間ができたので、懸念していた問題文の分量が少ない場合の対処を考え、簡単なマクロを書いてみました。
#北見さんのご指摘通りです。

作成にあたっての備忘録他。

      問題文の箱の高さを求めるのに \settoheight の類を
      使っているとおもいますが、高さの他に深さの情報も必要になる様です。

    今回の問題に対処するには以下のような手順が必要です。

    1) 図を組版した時の幅・高さ・深さを調べる
    2) 図の幅分を差し引いた幅で問題文を組版した時の幅・高さ・深さを調べる
    3) 問題文の「高さ+深さ」が図のそれより少ない場合は \vspace で不足分を補充する

上記に即したマクロを添付のファイル内に書き込んであります。
検討していただけると幸いです。
和田 勇 への返信

Re: 縮小したTikzを文章に回り込ませる方法

- 北見 けん の投稿
すっかり忘れていましたが、6年ほど前に wrapfig について書いたものがありました。

https://okumuralab.org/tex/mod/forum/discuss.php?d=1837#p10708

図の大きさの自動計測機能もあるようです。

北見 けん への返信

Re: 縮小したTikzを文章に回り込ませる方法

- 和田 勇 の投稿
幅を 0pt で warpfig すると自動計算してくれて便利!!

\begin{mysimplebox}
  {\textbf{問題\refstepcounter{nombre}\thenombre}}
  \vspace{0.2cm}
  \begin{wrapfigure}{r}{0pt}
    tikz 図形
  \end{wrapfigure}
  問題文
\end{mysimplebox}

概ね横2、3文字分のスペースが問題文の表記に使えるようですね。

ただ、一連のやり取りを見た限り、
今回のように 「tcolorbox で箱枠の飾り」をつけた場合、
問題文の分量が図の高さに満たない場合、
図が枠線からはみでてしまう件の解決方法は見つけられませんでした。
→ 別の処方法があるのであれば教えてください。

- 試したこと
  - \begin{wrapfigure} から問題文までを \savebox に入れたものを
    tcolorbox 内で \usebox すれば良いかな ... とおもいましたが
    wrapfigure をしようとしたところでエラーになり、断念
  - tcolorbox なので height パラメータを追加指定できるようにして
    tcolorbox を呼ぶときに height=\myXxxHT を指定すると、
    飾り枠の高さが固定されてしまうので  ... 断念
  - rule[-XXX]{0pt}{0pt} で見えない柱のテストもしたけど、
    一行目と二行目の間が空きすぎて ... 断念

- 取り敢えずの対処方法案
  - 冒頭に提示したもので一旦タイプセットし、pdf を見て必要に応じて  \vfill を入れる
  - 先に投稿したサンプルスクリプト内で記述したマクロを流用しつつ、
      冒頭に提示したもののように 0pt で自動計算させる。
      ただし、問題文の分量が少ない場合は、\\ で改行すると空きすぎなので intextsep を利用する
和田 勇 への返信

Re: 縮小したTikzを文章に回り込ませる方法

- 大熊 一弘 の投稿
外野からの乱入,ご容赦を。

emath パッケージの mawarikomi環境を使用した例です。

図に比して,文章が短い場合に対して,
emath では,
\mawarikomiowari
というコマンドを用意しています。
それを用いた実行例
reQA3443.tex
と,それを emath訂正版 emathc210509 でタイプセットした結果の
reQA3443.pdf
を zip でまとめたものを
http://emath.s40.xrea.com/temp/reQA3443.zip
に置きます。

なお,図の方が高い場合は,
mawarikomi環境ではなく,EMnidan環境
の方が簡潔です。そのリスト reQA3443n.texとpdfを上記zipファイルに含めます。
大熊 一弘 への返信

Re: 縮小したTikzを文章に回り込ませる方法

- 和田 勇 の投稿

大熊さん、 emath 利用の方法をご紹介いただきありがとうございました。

Tatsuya Ogawaさんへ、 emath を利用されるか、私の拙いマクロに北見さんの紹介された wrapfigure で幅を 0pt 指定することで自動計算させる様に改良したものを利用されるか ご自由に決めていただければとおもいます。