Создавайте новую переменную каждый раз, когда вызывается среда в LaTeX.

Я создал пример среды для своих математических заметок. Он берет заголовок примера в качестве входных данных и рисует несколько строк с помощью tikz. Однако для этого требуется длина заголовка.

Это относительно легко сделать, когда среда вызывается только один раз с использованием \newlength{\lengthname}, за которым следует \settowidth{\lengthname}{[length]}. Однако, как только он вызывается более одного раза, необходимо определить другую длину. Мой (по общему признанию плохой) обходной путь заключался в том, чтобы передавать имя разной длины, #2, каждый раз, когда я использую свою примерную среду.

Как мне создать уникальный \newlength{\unique} каждый раз, когда я использую свою среду, или есть ли лучший способ достичь моей цели?

\newenvironment{example}[2] % Example Environment
    {\refstepcounter{example}
    \newlength{#2}
    \settowidth{#2}{\small \textbf{Example \thesection.\theexample} --- #1}
    \bigskip\begin{tikzpicture}
        \draw (-0.5\columnwidth,-0.2)--(-0.5\columnwidth,0)--(0.5\columnwidth,0)--(0.5\columnwidth,-0.2);
        \fill[white] (-0.5#2-5pt,-1pt) rectangle (0.5#2+5pt,1pt);
        \tikzlabel{0}{-0.4}{\text{\small \textbf{Example \thesection.\theexample} --- #1}}
    \end{tikzpicture}}
    %
    {\begin{tikzpicture}
        \draw (-0.5\columnwidth,0.2) -- (-0.5\columnwidth,0) -- (0.5\columnwidth,0) -- (0.5\columnwidth,0.2);
    \end{tikzpicture}}

Большое спасибо.


person aelamrn1    schedule 06.10.2020    source источник
comment
Не могли бы вы сделать минимально воспроизводимый пример, а не просто фрагмент кода?   -  person samcarter_is_at_topanswers.xyz    schedule 06.10.2020
comment
Почему вы используете новую длину каждый раз, когда вызываете окружение? Почему нельзя просто повторно использовать один и тот же?   -  person samcarter_is_at_topanswers.xyz    schedule 06.10.2020
comment
В любом случае, зачем изобретать велосипед, если в tcolorbox есть библиотека теорем?   -  person samcarter_is_at_topanswers.xyz    schedule 06.10.2020


Ответы (1)


Я предлагаю использовать tcolorbox вместо того, чтобы рисовать рамку самостоятельно, но если вы должны использовать tikz, просто используйте белый фон для своего заголовка.

Обратите внимание, что ваш код будет выдавать много предупреждений о переполнении ящика. Вы должны учитывать отступ, и рисование рамки столбца не подходит, потому что вам нужно дополнительно вдвое больше половины ширины линий tikz. Я просто уменьшил ширину до .49\columnwidth, но вы могли бы также учитывать ширину линии в своих расчетах.

Также обратите внимание на расстояние вокруг ---. Если вы не запретите макросу ранее заглатывать пространство, он не будет центрирован.

\documentclass{article}

\usepackage{tikz}
\newcounter{example}


\newenvironment{example}[1]{%
  \refstepcounter{example}%
  \bigskip
  \noindent%
  \begin{tikzpicture}
    \draw (-0.49\columnwidth,-0.2)--(-0.49\columnwidth,0)--(0.49\columnwidth,0)--(0.49\columnwidth,-0.2);
    \node[fill=white,font=\small\bfseries] at (0,-1pt) {Example \thesection.\theexample{} --- #1};
  \end{tikzpicture}%
  \par%
}{%
  \par%
  \noindent%
  \begin{tikzpicture}
    \draw (-0.49\columnwidth,0.2) -- (-0.49\columnwidth,0) -- (0.49\columnwidth,0) -- (0.49\columnwidth,0.2);
  \end{tikzpicture}%
  \par%
}


\begin{document}


\begin{example}{test}
content...
\end{example}


\end{document}

введите здесь описание изображения

person samcarter_is_at_topanswers.xyz    schedule 06.10.2020