我想创建一个具有以下行为的框架环境。
- 只需显示内容的最后 8 行。如果内容超过 8 行,LaTeX 必须发出温和警告。
- 框架的宽度恰好等于16个字母。
- 必须使用固定宽度字体。
- 内容不能包含公式。如果是,则必须发送错误。
这是为了模拟一个计算器的屏幕。
以下解决方案几乎可行,只是我希望内容和框之间有更好的对称间距。
需要做哪些改变?
\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
您可以使用以下步骤来实现所需的行为:
可以通过装箱和测量内容来完成。可以剪掉过长的框并发出警告。
collectbox
或adjustbox
包都可以帮助您完成此操作。裁剪多行并非没有风险。您还可以使用一些较低级别的 TeX 代码使 TeX 在 8 行后中断,然后自己丢弃其余部分,但这更复杂(至少对我来说)。将它包装在
{minipage}{8em}
环境中即可。您需要测试宽度是否合适,但对于等宽字体来说应该是合适的。添加
\ttfamily
(在 之前minipage
,这样就16em
可以得到tt
值)您可以本地重新定义常见的数学宏(,,,
$
... )以产生错误。\[
\(
我在此假设内容不必跨越页面边界。
下面的应该可以做到:
\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}