“变量”的图形占位符

“变量”的图形占位符

问题

下面的图片准确地显示了我在 LaTeX 中试图实现的目标。

3 + _ = 7?

研究

  • 使用\fbox(如彼得·格里尔建议这个帖子):

    \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}$.

彩色盒子 1

有答案的彩色盒子

彩色盒 2

框

下划线框

虚线下划线框

下支架箱

彩色底架盒

下部支架盒

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}

占位符2

相关内容