具有固定大小的框架环境,由字符数和行数给出

具有固定大小的框架环境,由字符数和行数给出

我想创建一个具有以下行为的框架环境。

  1. 只需显示内容的最后 8 行。如果内容超过 8 行,LaTeX 必须发出温和警告。
  2. 框架的宽度恰好等于16个字母。
  3. 必须使用固定宽度字体。
  4. 内容不能包含公式。如果是,则必须发送错误。

这是为了模拟一个计算器的屏幕。

以下解决方案几乎可行,只是我希望内容和框之间有更好的对称间距。

在此处输入图片描述

需要做哪些改变?

\documentclass{article}
    \usepackage{adjustbox}
    \usepackage{color}

% For tests
    \usepackage{comment}


    \makeatletter
        \catcode`\$=\active
        \newenvironment{calculator}{%
            \ttfamily
            \let\(\calculator@error
            \let\[\calculator@error
            \let\array\calculator@error
            % etc.
            \catcode`\$=\active
            \let$\calculator@error
            \begin{lrbox}{\@tempboxa}%
            \minipage[b]{8em}%
        }{%
            \endminipage
            \end{lrbox}%
            \par\smallskip
            % Measure height and clip if required
            \ifdim\ht\@tempboxa>8\baselineskip
                \PackageWarning{calculator}{%
                    calculator environment to long%
                }%
                % clip to only show the 8 last lines:
                \fbox{\clipbox*{0pt {\depth} {\width} 7.5\baselineskip}{%
                    \usebox\@tempboxa
                }}%
            \else
                \fbox{\usebox\@tempboxa}%
            \fi
            \smallskip
        }
        \catcode`\$=3

        \newcommand{\calculator@error}{%
            \PackageError{calculator}{%
                No math is allowed inside calculator environment%
            }{}%
        }

        \newcommand{\tiFocus}[1]{%
            \hspace{-\fboxsep}%
            \colorbox{black}{\textcolor{white}{#1}}%
            \hspace{-\fboxsep}%
        }
    \makeatother


\begin{document}

\section*{8 lines}

\begin{calculator}
\tiFocus{1 3 5 7 9 B D F}
.2 4 6 8 A C E
1 3 5 7 9 B D F
.2 4 6 \tiFocus{8} A C E
1 3 5 7 9 B D F
.2 4 6 8 A C E
1 3 5 7 9 B D F
.2 4 6 8 A C E
\end{calculator} 

答案1

编辑:抱歉,我使用了新版本,但目前 CTAN 上不可用。我认为在接下来的几天内上传将完成。

要编译,请使用以下版本github mdframed

如果您想mdframed在此处使用解决方案:

我使用了 Martin 的数学错误宏。

@Martin:我希望没事。

编辑2:改变了环境内部的数学检测。

\documentclass{article}
\usepackage[paper=a5paper]{geometry}
\usepackage{microtype}

\usepackage[skipabove=\topskip,skipbelow=\topskip]{mdframed}
\makeatletter
\newif\ifmathinside\mathinsidefalse
\def\IfContainsMathMode{%
  \ifmathinside
    \expandafter\@firstoftwo%
  \else
    \expandafter\@secondoftwo%
  \fi%
  }


\preto\detected@md@put@frame{%
 \IfContainsMathMode{\calculator@error}{}
   \ifdimless{\ht\@tempboxa}{8\baselineskip}
    {}{%
    \splitmaxdepth\z@ \splittopskip\z@
    \dimen@=\dimexpr\ht\@tempboxa-7.9\baselineskip\relax
    \setbox0\vsplit\@tempboxa to \z@
    \setbox\tw@\vsplit\@tempboxa to \dimen@
    \setbox\@tempboxa\vbox{\unvbox0\unvbox\@tempboxa}
    \md@reset
    }%
}
\newcommand{\calculator@error}{%
    \PackageWarning{calculator}{%
        No math is allowed inside calculator environment\MessageBreak%
    }%
}

\newenvironment{calculator}{%
  \begin{mdframed}[linecolor=red,%innerleftmargin=0pt,innerrightmargin=0pt,%
                   settings={\ttfamily\everymath={\global\mathinsidetrue}\sloppy},
                   userdefinedwidth=\dimexpr8em+20.8pt\relax,
                   ]%
 }%
 {%
  \end{mdframed}
  \global\mathinsidefalse
}
\begin{document}


8 lines:

\begin{calculator}

1 3 5 7 9 B D F 
.2 4 6 8 A C E 
1 3 5 7 9 B D F 
.2 4 6 8 A C E 
1 3 5 7 9 B D F 
.2 4 6 8 A C E 
1 3 5 7 9 B D F 
.2 4 6 8 A C E 
\end{calculator}

% 
9 lines:
\begin{calculator}
.5 5 5 5 5 C E 
.2 4 6 8 A C E 
1 3 5 7 9 B D F 
.2 4 6 8 A C E 
1 3 5 7 9 B D F 
.2 4 6 8 A C E 
1 3 5 7 9 B D F 
.2 4 6 8 A C E 
.4 4 4 4 A C E 
\end{calculator}



8 lines:
\begin{calculator}
1 3 5 7 9 B D F 
.2 4 6 8 A C E 
1 3 5 7 9 B D F 
.2 4 6 8 A C E 
1 3 5 7 9 B D F 
.2 4 6 8 A C E 
1 3 5 7 9 B D F 
.2 4 6 8 A C E 
\end{calculator}
math:
\begin{calculator}
1 3 5 7 9 B D F
.2 4 6 8 A C E
1 \(a+b\) B D F
.2 4 6 8 A C E
1 $a+b$  B D F
.2 4 6 8 A C E
1 \[i+b\] B D F
.2 4 6 8 A C E
\end{calculator}
\end{document}

在此处输入图片描述

答案2

您可以使用以下步骤来实现所需的行为:

  1. 可以通过装箱和测量内容来完成。可以剪掉过长的框并发出警告。collectboxadjustbox包都可以帮助您完成此操作。裁剪多行并非没有风险。您还可以使用一些较低级别的 TeX 代码使 TeX 在 8 行后中断,然后自己丢弃其余部分,但这更复杂(至少对我来说)。

  2. 将它包装在{minipage}{8em}环境中即可。您需要测试宽度是否合适,但对于等宽字体来说应该是合适的。

  3. 添加\ttfamily(在 之前minipage,这样就16em可以得到tt值)

  4. 您可以本地重新定义常见的数学宏(,,,$... )以产生错误。\[\(

我在此假设内容不必跨越页面边界。

下面的应该可以做到:

\documentclass{article}

\usepackage{adjustbox}

\makeatletter
\catcode`\$=\active
\newenvironment{calculator}{%
    \ttfamily
    \let\(\calculator@error
    \let\[\calculator@error
    \let\array\calculator@error
    % etc.
    \catcode`\$=\active
    \let$\calculator@error
    \begin{lrbox}{\@tempboxa}%
    \minipage[b]{8em}%
}{%
    \endminipage
    \end{lrbox}%
    \par\smallskip
    % Measure height and clip if required
    \ifdim\ht\@tempboxa>8\baselineskip
        \PackageWarning{calculator}{%
            calculator environment to long%
        }%
        % clip to only show the 8 last lines:
        \fbox{\clipbox*{0pt {\depth} {\width} 7.5\baselineskip}{%
            \usebox\@tempboxa
        }}%
    \else
        \fbox{\usebox\@tempboxa}%
    \fi
    \par\smallskip
}
\catcode`\$=3

\newcommand{\calculator@error}{%
    \PackageError{calculator}{%
        No math is allowed inside calculator environment%
    }{}%
}
\makeatother

\begin{document}

8 lines:
\begin{calculator}
 1 3 5 7 9 B D F
 .2 4 6 8 A C E
 1 3 5 7 9 B D F
 .2 4 6 8 A C E
 1 3 5 7 9 B D F
 .2 4 6 8 A C E
 1 3 5 7 9 B D F
 .2 4 6 8 A C E
\end{calculator}

9 lines:
\begin{calculator}
 1 3 5 7 9 B D F
 .2 4 6 8 A C E
 1 3 5 7 9 B D F
 .2 4 6 8 A C E
 1 3 5 7 9 B D F
 .2 4 6 8 A C E
 1 3 5 7 9 B D F
 .2 4 6 8 A C E
 1 3 5 7 9 B D F
\end{calculator}

math:
\begin{calculator}
 1 3 5 7 9 B D F
 .2 4 6 8 A C E
 1 \(a+b\) B D F
 .2 4 6 8 A C E
 1 $a+b$  B D F
 .2 4 6 8 A C E
 1 \[i+b\] B D F
 .2 4 6 8 A C E
\end{calculator}

\end{document}

相关内容