カスタムパディングを使用して高さと幅を固定したボックスを作成する方法

カスタムパディングを使用して高さと幅を固定したボックスを作成する方法

私は LaTeX 初心者ですが、TI84 計算機の出力をドキュメントに含めようとしています。

次のようになるはずです:

実際のTI 84

私が作れるものは以下の通りです。

私のテキサス計算機

出力の高さと幅は自動的に調整されますが、高さ/幅を固定し、カスタムパディングとボックス内のテキストの折り返しが必要です。ご協力いただければ幸いです。

私のコードは

{\scriptsize
\setmainfont{Texas Instruments TI-84 series}
\tabulinesep=0.05 in
\begin{tabu} to 1 in {|c |}
\hline
normalcdf(-1.5,2)\\
\hfill .9104427093
\\\hline
\end{tabu}
}

答え1

プリミティブ\vbox to...構造があなたの質問に対する答えです。次のコードを試すことができます。

\def\tifont{\setmainfont{Texas Instruments TI-84 series}}
\setbox0=\hbox{\tifont 12345678901234567\kern2pt}\edef\tiwidth{\wd0}
\def\ticalc#1{\hbox{\vrule\vbox to2cm{\hrule\kern1pt
   \def\l##1|{\hbox to\tiwidth{\kern1pt##1\kern1pt\hss}}\tifont #1\vss\hrule}\vrule}}

\ticalc{
\l normalcdf(-1.5,2)|
\l\hfill .9104427093|
}

編集:私のマクロの 2 番目のバージョンでは、\ticalc自動折り返しを実装しています。ボックスの幅は setbox で設定する必要があります。16\setbox0文字を想定している行を参照してください。この寸法を超える長さのテキストは折り返されます。折り返しは、文字の各ペア間で可能です。

オプション\resultの に続くテキストをマクロのパラメータに含めることができます\ticalc。このようなテキストは次の行に右揃えで印刷されます。

\def\titext{\hsize=\tiwidth \leftskip=1pt\rightskip=1pt plus1fil \tifont \noindent \titextA}
\def\titextA{\futurelet\next\titextB}
\def\titextB{\ifx\next\result \else \null\next \penalty0 \expandafter\titextC \fi}
\def\titextC{\afterassignment\titextA \let\next= }

\newfontfamily\tifont{Texas Instruments TI-84 series}
\setbox0=\hbox{\tifont 1234567890123456\kern2pt}\edef\tiwidth{\wd0}
\def\ticalc#1{\hbox{\vrule\vbox to2cm{\hrule\kern1pt\titext#1\result\relax\vss\hrule}\vrule}}
\def\result#1\relax{\par\let\result=\relax \hbox to\tiwidth{\hss#1\kern1pt}}

\ticalc{normalcdf(-1.5,2)\result .9104427093}

\ticalc{abcdefghijklmnopqrsyuyu}

答え2

次のソリューションは、このコードの一部を借用しています。素晴らしい答えエグレの:

\ExplSyntaxOn
\NewEnviron{terminal}
 {
  \raggedright\varun_zerohyphen:V \BODY
 }

\seq_new:N \l_varun_body_seq

\cs_new_protected:Npn \varun_zerohyphen:n #1
 {
  \seq_set_split:Nnn \l_varun_body_seq { ~ } { #1 }
  \seq_map_inline:Nn \l_varun_body_seq { \varun_printword:n { ##1 } }
 }
\cs_generate_variant:Nn \varun_zerohyphen:n { V}

\cs_new_protected:Npn \varun_printword:n #1
 {
  \tl_map_inline:nn { #1 } { ##1 \penalty0 \scan_stop: }
  \c_space_tl
 }
\ExplSyntaxOff

terminalこれにより、ボックス内のテキストを自動的に折り返す新しい環境が定義されます。

ボックスは環境のminipage内部を通して作られますtcolorbox

これが完全なコードです

\documentclass{article}

\usepackage{tcolorbox}
\usepackage{amssymb}

\usepackage{fontspec}
\newfontfamily\TIfont{Texas Instruments TI-84 series}

% Start ----------- Code from https://tex.stackexchange.com/a/153692

\usepackage{xparse,environ}

\ExplSyntaxOn
\NewEnviron{terminal}
 {
  \raggedright\varun_zerohyphen:V \BODY
 }

\seq_new:N \l_varun_body_seq

\cs_new_protected:Npn \varun_zerohyphen:n #1
 {
  \seq_set_split:Nnn \l_varun_body_seq { ~ } { #1 }
  \seq_map_inline:Nn \l_varun_body_seq { \varun_printword:n { ##1 } }
 }
\cs_generate_variant:Nn \varun_zerohyphen:n { V}

\cs_new_protected:Npn \varun_printword:n #1
 {
  \tl_map_inline:nn { #1 } { ##1 \penalty0 \scan_stop: }
  \c_space_tl
 }
\ExplSyntaxOff

% End ----------- Code from https://tex.stackexchange.com/a/153692


\begin{document}

{\scriptsize
\TIfont
\begin{tcolorbox}[%
      arc=0pt,
      outer arc=0pt,
      boxsep=1pt,
      top=0mm,
      bottom=10mm,
      left=0mm,
      right=0mm,
      boxrule=0.3pt,
      colback=white,
      colframe=black,
      hbox
]
\begin{minipage}{1.14in}
\begin{terminal}
normalcdf(-1.5,2)\par
\hfill .9104427093\par
$\blacksquare$\par
\end{terminal}
\end{minipage}
\end{tcolorbox}
}

\end{document} 

結果は次のようになります:

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

答え3

karlkoeller の回答のバリエーションで、ボックスの幅、高さ、パディング、配置をカスタマイズできます。配置とは、周囲の素材に対するボックスの垂直方向の配置を指します。

セットアップでは、ボックス内で等幅フォントが使用されることを想定しています。「Texas Instruments TI-84 シリーズ」フォントがないため、「DejaVu Sans Mono」を使用しました。行内のフォントを変更するだけです\newfontfamily

デフォルト値:

  • 高さ: 8 (行)
  • 幅: 16 (文字)
  • パディング: 1pt
  • 整列: c

の可能な値は、、およびalignです。ctb

示されているように、オプションの引数でキー値インターフェースを使用して値を設定できますterminal

\documentclass{article}
\usepackage{amssymb}
\usepackage{xparse,environ}
\usepackage{fontspec}

\newfontfamily\TI{DejaVu Sans Mono} % or whatever

\ExplSyntaxOn
\NewEnviron{terminal}[1][]
 {
  \scriptsize\TI
  \keys_set:nn { varun/display } { width=16 , #1 }
  \fbox
   {
    \parbox
     [\l_varun_align_tl]                 % outer alignment
     [\l_varun_height_int \baselineskip] % height
     [t]                                 % inner alignment
     {\l_varun_width_dim}                % width
     {
      \raggedright % don't try filling up lines
      \varun_zerohyphen:V \BODY
     }
   }
 }

\seq_new:N \l_varun_body_seq
\dim_new:N \l_varun_width_dim

\cs_new_protected:Npn \varun_zerohyphen:n #1
 {
  \seq_set_split:Nnn \l_varun_body_seq { ~ } { #1 }
  \seq_map_inline:Nn \l_varun_body_seq { \varun_printword:n { ##1 } }
 }
\cs_generate_variant:Nn \varun_zerohyphen:n { V }

\cs_new_protected:Npn \varun_printword:n #1
 {
  \tl_map_inline:nn { #1 } { ##1 \penalty\c_zero }
  \c_space_tl
 }

\cs_new_protected:Npn \__varun_set_width:n #1
 {
  \hbox_set:Nn \l_tmpa_box { \prg_replicate:nn { #1 } { A } }
  \dim_set_eq:NN \l_varun_width_dim \box_wd:N \l_tmpa_box
 }

\keys_define:nn { varun/display }
 {
  width   .code:n    = \__varun_set_width:n { #1 },
  padding .code:n    = \dim_set:Nn \fboxsep { #1 },
  padding .initial:n = 1pt,
  height  .int_set:N = \l_varun_height_int,
  height  .initial:n = 8,
  align   .tl_set:N  = \l_varun_align_tl,
  align   .initial:n = c,
 }
\ExplSyntaxOff

\begin{document}

\begin{terminal}
normalcdf(-1.5,2)\\
\hfill .9104427093\\
1\\
2\\
3\\
4\\
\end{terminal}\qquad
\begin{terminal}[width=20]
normalcdf(-1.5,2)\\
\hfill .9104427093\\
\end{terminal}

\bigskip

\begin{terminal}[align=t]
normalcdf(-1.5,2)\\
\hfill .9104427093\\
\end{terminal}\qquad
\begin{terminal}[align=t,height=4]
normalcdf(-1.5,2)\\
\hfill .9104427093\\
\end{terminal}\qquad
\begin{terminal}[align=t,height=4,padding=6pt]
normalcdf(-1.5,2)\\
\hfill .9104427093\\
\end{terminal}


\end{document} 

の代わりに、\fboxが提供するより高度なメソッドを使用することもできますtcolorbox

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

関連情報