问题
下面的图片准确地显示了我在 LaTeX 中试图实现的目标。
研究
-
\documentclass[]{article} \usepackage{amsmath} \begin{document} \newcommand*{\Y}{\textbf{\fbox{?}}}% \[3 + \Y = 7\] \end{document}
我考虑过用空格代替问号,然后删除顶部边框,但我还没有找到有关如何隐藏特定边框的任何资料。
使用
\fcolorbox
:再次,我不知道如何隐藏顶部边框。
使用
mdframed
:据我所知,这在数学模式下不起作用。
对 Donut E. Knot 的帖子(以前接受的答案)进行了小幅改进
Donut E. Knot 的帖子完美地回答了这个问题,然而,我想提供一点小小的改进,虽然对于自己的答案来说太小了,但仍然非常有用,不会在评论中丢失。
在Knot的代码下添加如下代码:
\newdimen{\phWidth}%
\newcommand\phAutoWidth[1]{%
\setlength{\phWidth}{\widthof{#1}}%
\ph[\phWidth]{#1}}
现在您不再需要明确指定宽度,而是会自动计算。
答案1
这是基于 TikZ 的数学和文本解决方案。
用法
用于\fib{<text/math>}
创建填写框。使用星号版本显示单个框的解决方案或\fibhideanswerfalse
显示所有解决方案。使用\tikzset{fill in/.style={<box style>}}
或\tikzset{<underline/bracket> style/.style={<drawing style>}}
可以全局更改样式,或使用\fib[underlined box]{<text/math>
更改单个框的样式。
例子
A \fib{short} example with math $1 + 2^{\fib{2}} = \fib{5} = \sqrt{25}$.
beamer
班级
可以使用以下方法,在一张幻灯片上放空框,在下一张幻灯片上放解决方案。
\begin{frame}{Beamer example}
\only<2->{\fibhideanswerfalse}
A \fib{short} example with math $1 + 2^{\fib{2}} = \fib{5} = \sqrt{25}$.
\end{frame}
或者使用下面的方法逐步显示答案。
\begin{frame}{Beamer example}
A \fib<2->{short} example with math $1 + 2^{\fib<3->{2}} = \fib<4->{5} = \sqrt{25}$.
\end{frame}
代码
我的博客里也有德语解释:TeX-Monats 示例:Lückentexte。
\documentclass[fleqn]{article}
%\documentclass{beamer}
\usepackage{xparse}
\usepackage{tikz}
\usetikzlibrary{calc}
\usepackage{mathtools}
\makeatletter
\newlength\fib@width
\def\fib@widthfactor{1.75}
\newif\iffibhideanswer
\fibhideanswertrue
\tikzset{
every fill in box/.style={
inner xsep=0pt,
minimum height=3ex,
align=center,
font={\sffamily\slshape},
},
colored box/.style={
every fill in box,
fill=yellow!50!white,
},
framed box/.style={
every fill in box,
draw,
},
underline style/.style={},
underlined box/.style={
every fill in box,
append after command={%
\pgfextra{\begin{pgfinterruptpath}
\draw [underline style] (\tikzlastnode.south west)
-- (\tikzlastnode.south east);
\end{pgfinterruptpath}}
},
},
bracket style/.style={},
underbracked box/.style={
every fill in box,
append after command={%
\pgfextra{\begin{pgfinterruptpath}
\draw [bracket style] ($(\tikzlastnode.south west)+(0,2pt)$)
|- (\tikzlastnode.south)
-| ($(\tikzlastnode.south east)+(0,2pt)$);
\end{pgfinterruptpath}}
},
},
underoverbracked box/.style={
every fill in box,
append after command={%
\pgfextra{\begin{pgfinterruptpath}
\draw [bracket style] ($(\tikzlastnode.north west)-(0,2pt)$)
|- (\tikzlastnode.north)
-| ($(\tikzlastnode.north east)-(0,2pt)$);
\draw [bracket style] ($(\tikzlastnode.south west)+(0,2pt)$)
|- (\tikzlastnode.south)
-| ($(\tikzlastnode.south east)+(0,2pt)$);
\end{pgfinterruptpath}}
},
},
fill in/.style={
colored box,
},
}
\NewDocumentCommand { \fib@hide } { m } {%
\iffibhideanswer
\phantom{#1}%
\else
#1%
\fi
}
\NewDocumentCommand { \fib@makebox }{ m }{%
\settowidth{\fib@width}{\tikz\node[fill in]{#1};}%
\begin{tikzpicture}[baseline=(fill in node.base)]
\node (fill in node) [text width=\fib@widthfactor*\fib@width,fill in] {%
\fib@hide{#1}%
};
\end{tikzpicture}%
}
\NewDocumentCommand { \fib } { s d{<}{>} o m }{{%
\IfBooleanT{#1}{\fibhideanswerfalse}%
\IfValueT{#2}{\only<#2>{\fibhideanswerfalse}}%
\IfValueT{#3}{\tikzset{fill in/.style={#3}}}%
\ifmmode
\mathchoice
{\fib@makebox{$\displaystyle#4$}}
{\fib@makebox{$\textstyle#4$}}
{\fib@makebox{$\scriptstyle#4$}}
{\fib@makebox{$\scriptscriptstyle#4$}}
\else
\fib@makebox{#4}%
\fi
\IfValueT{#2}{}%
}}
\makeatother
\begin{document}
% STYLE SETTING EXAMPLES
%\tikzset{colored box/.append style={fill=black!15}}
%\tikzset{fill in/.style={framed box}}
%\tikzset{fill in/.style={underlined box}}
%\tikzset{underline style/.style={densely dotted,thick}}
%\tikzset{fill in/.style={underbracked box}}
%\tikzset{fill in/.style={underoverbracked box}}
%\tikzset{bracket style/.style={gray,thick}}
%\fibhideanswerfalse
% ARTICLE/BOOK EXAMPLES
A \fib{short} example with math $1 + 2^{\fib{2}} = \fib{5} = \sqrt{25}$.
\vspace{2cm}
In \fib{text} mode and math $1 + 3 = \fib{4} = \fib{\frac{8}{2}}$
\begin{equation}
1 + 3 = \fib{4} = \fib{\frac{8}{2}}
\end{equation}
\begin{equation}
(a + b)^2 = \fib{a^2 + 2ab + b^2}
\end{equation}
\begin{equation}
\begin{pmatrix}
1 \\ 2 \\ 3
\end{pmatrix}
\times
\begin{pmatrix}
4 \\ 5 \\ 6
\end{pmatrix}
=
\fib{\begin{pmatrix}
-3 \\ 6 \\ -3
\end{pmatrix}}
\end{equation}
With an asterisk, i.e. \verb+\fib*+, the \fib*{solution} is always visible.
The optional argument can be used to change \fib*[underlined box]{styles} locally.
% BEAMER EXAMPLES
%\begin{frame}{Beamer example 1}
% \only<2->{\fibhideanswerfalse}
% A \fib{short} example with math $1 + 2^{\fib{2}} = \fib{5} =
% \sqrt{25}$.
%\end{frame}
%\begin{frame}{Beamer example 2}
% A \fib<2->{short} example with math $1 + 2^{\fib<3->{2}} =
% \fib<4->{5} = \sqrt{25}$.
%\end{frame}
\end{document}
实现概述
为了实现,我们需要tikz
(与calc
图书馆)和xparse
来实现填写框。我加载mathtools
例如{pmatrix}
……
\usepackage{xparse}
\usepackage{tikz}
\usetikzlibrary{calc}
\usepackage{mathtools}
下一步是使其@
可用于内部命令名称。
\makeatletter
然后我定义一个新的宽度,它将测量盒子的宽度,一个拉伸自然宽度的因素(手写比打印需要更多的空间)和一个显示或隐藏解决方案的开关(默认:隐藏):
\newlength\fib@width
\def\fib@widthfactor{1.75}
\newif\iffibhideanswer
\fibhideanswertrue
现在我可以定义一些 TikZ 样式了。every fill in box
定义了一些基本内容……
\tikzset{
every fill in box/.style={
inner xsep=0pt,
minimum height=3ex,
align=center,
font={\sffamily\slshape},
},
... 下一个样式定义了填充框的各种外观。
...
最后一种风格是假人风格,可以用来轻松改变风格。
fill in/.style={
colored box,
},
}
现在我需要一个辅助宏来隐藏或显示解决方案……
\NewDocumentCommand { \fib@hide } ...
…并使用所需的样式打印盒子:
\NewDocumentCommand { \fib@makebox } ...
现在我已经定义了一切\fib
(“填写框”)。它将有一个带星号的版本,用于始终打印解决方案,一个可选参数用于本地更改样式,以及一个强制参数,用于获取填写框的内容。根据星号(存储为 中的布尔值#1
),解决方案隐藏设置为 false。如果有一个可选参数(\IfValueT{#2}
),则重新定义样式。然后必须测试宏是处于数学模式(\ifmmode
= true)还是处于文本模式(\ifmmode
= false)。如果宏在数学内部,则必须检查并使用 处理当前样式\mathchoice
。
\NewDocumentCommand { \fib } ...
最后要做的是停用@
:
\makeatother
答案2
带有可选参数
\documentclass[preview,border=12pt]{standalone}
\usepackage{mathtools}
\newcommand\ph[2][1em]{%
\raisebox{-.5\height}{\rule{.5pt}{3pt}\rule{#1}{.5pt}\rule{.5pt}{3pt}}%
\hspace{-.5\dimexpr#1+1pt\relax}\clap{#2}\hspace{.5\dimexpr#1+1pt\relax}}
\begin{document}
$1+\ph{}=3$, find $\ph[2em]{}$. Answer $\ph[3em]{2}$.
\end{document}
答案3
(非常)轻量级的方法:
\documentclass{article}
\newcommand{\ph}{\texttt{\char32 }}
\begin{document}
$1+\ph=3$, find $\ph$.
\end{document}
我为没有使用过\textvisiblespace
而感到遗憾。这里有一些有趣的事情,在OT1
编码中,\textvisiblespace
实际上是使用规则完成的:
\OT1\textvisiblespace ->\mbox {\kern .06em\vrule \@height .3ex}% \vbox {\hrule \@ width .3em}\hbox {\vrule \@height .3ex}
但在编码上与上面使用的T1
相同。\char32
\documentclass{article}
\newcommand{\ph}{\texttt{\textvisiblespace}}
\begin{document}
% \showoutput
$\texttt{\char32}\neq\textvisiblespace$ in encoding OT1.
{\usefont{T1}{cmtt}{m}{n}\char32}${}={}${\usefont{T1}{cmtt}{m}{n}\textvisiblespace}
in encoding T1.
\end{document}