带圆圈的内联字母,其最小尺寸可容纳 az 字母表的每个字母

带圆圈的内联字母,其最小尺寸可容纳 az 字母表的每个字母

对于下面的解决方案来说是一个非常好的起点,但对于我的用例来说仍然不够完美。

我尝试对其进行调整,使其显示 3 个带圆圈的字母,带圆圈的字母之间有零个或多个字母,并且第一个和第三个圆圈中有零个或多个字母。换句话说,所需的方案是我想输入xOxOxOx,其中每个O代表一个带圆圈的可能不同的字母,每个x代表零个或多个字母的序列。所需的结果如下所示(代码如下):

在此处输入图片描述

我不喜欢这个解决方案的地方在于,我必须1.3为 硬编码一个乘法因子\f@size。事实上,如果我删除*1.3,那么圆的大小会比周围的圆圈大。链接答案中的 1.6 似乎有点太多了。

以下是 MWE 验证的David Carlisle 的 TeXlive.net

\documentclass{article}
\usepackage{tikz}

\begin{document}
\makeatletter
\newcommand\stencil[7]{%
\tikz[outer sep=0, inner sep=0, baseline=(A.base), anchor=west]{
  \node (A) {\vphantom{Wpm}#1};
  \node[shape=circle, draw, minimum height={\f@size*1.3}] (B) at (A.east) {\vphantom{Wpm}#2};
  \node (C) at (B.east) {\vphantom{Wpm}#3};
  \node[shape=circle, draw, minimum height={\f@size*1.3}] (D) at (C.east) {\vphantom{Wpm}#4};
  \node (E) at (D.east) {\vphantom{Wpm}#5};
  \node[shape=circle, draw, minimum height={\f@size*1.3}] (F) at (E.east) {\vphantom{Wpm}#6};
  \node (G) at (F.east) {\vphantom{Wpm}#7};
}%
}
\makeatother

before\stencil{h}{i}{j}{k}{}{m}{}after

beforeh

before \stencil{h}{i}{j}{k}{}{m}{} after

before h

\end{document}

答案1

使用text height={height("W")}text depth={depth("p")}text width={width("m")},您可以将节点文本的高度、深度和宽度设置为与 相同的高度W、与 相同的深度p和与 相同的宽度m

\documentclass{article}
\usepackage{tikz}
\tikzset{
    mystyle/.style={ 
        text centered,
        text height={height("W")}, 
        text depth={depth("p")}
        },
    mycircle/.style={
        mystyle,
        shape=circle, draw,
        text width={width("m")} 
        }
    }

\newcommand\mystencil[7]{%
    \tikz[outer sep=0, inner sep=0, baseline=(A.base), anchor=west]{
      \node[mystyle] (A) {#1};
      \node[mycircle] (B) at (A.east) {#2};
      \node[mystyle] (C) at (B.east) {#3};
      \node[mycircle] (D) at (C.east) {#4};
      \node[mystyle] (E) at (D.east) {#5};
      \node[mycircle] (F) at (E.east) {#6};
      \node[mystyle] (G) at (F.east) {#7};
}%
}

\begin{document}

before\mystencil{h}{i}{j}{k}{}{m}{}after

beforeh

before \mystencil{h}{i}{j}{k}{}{m}{} after

before h

\end{document}

在此处输入图片描述

答案2

也许我误解了这里的问题,但圈出单个内联字母的宏可能更简单,要么像您的示例中那样设置,要么像下面的代码中那样设置,并\vphantom设置:text depthtext heightminimum size

在此处输入图片描述

\documentclass{article}

\usepackage{tikz}
\newcommand{\C}[1]{\tikz[baseline=(A.base)]{\node[draw, circle, minimum size=3ex, text depth=.5ex, text height=1.8ex, inner sep=0pt](A){#1};}}

\begin{document}

h \C{m}j\C{i}\C{j}\C{k} a

\end{document}

答案3

Unicode 有一个Enclosed Alphanumerics代码块,因此您可以直接输入合适的字体,例如 Noto Sans Symbols 或 CJK 字体:

封闭式

请注意,这里的圆圈是起点,字母被设计得适合,就像打字机一样,行距保持不变。

平均能量损失

\documentclass{article}

\usepackage{fontspec}
\newfontface{\cc}{Noto Sans Symbols}
\newfontface{\dd}{Noto Serif CJK JP}

\begin{document}

Examples

before {\cc hⓘjⓚlⓜ} after

{\cc before hⓘjⓚlⓜ after ⓗⓘⓙⓚⓛⓜ}


before {\dd hⓘjⓚlⓜ} after

{\dd before hⓘjⓚlⓜ after ⓗⓘⓙⓚⓛⓜ}


\end{document}

答案4

您不需要 TikZ 来声明您的\stencil宏。它\enclosecircle是在 Unicode 数学中声明的。

\newbox\circlebox
\setbox\circlebox=\hbox to1.1em{\hss$\phantom x\enclosecircle$\hss}
\def\ecirc#1{\leavevmode\rlap{\hbox to1.1em{\hss#1\hss}}\copy\circlebox}

\def\stencil#1#2#3#4#5#6#7{#1\ecirc#2#3\ecirc#4#5\ecirc#6#7}

before\stencil{h}{i}{j}{k}{}{m}{}after

\bye

相关内容