Настройка среды для автоматической и случайной маркировки уравнений символами

Настройка среды для автоматической и случайной маркировки уравнений символами

Итак, используя среду уравнений и \label{ ... }, легко получить уравнения, которые автоматически нумеруются в документе. Если мы хотим настроить символ, который маркирует документ, мы можем использовать \tag{ ... }.

Однако есть ли хороший способ настроить среду так, чтобы в указанном документе уравнения автоматически помечались случайными символами? Здесь набор потенциальных символов будет указан заранее где-то в документе, и разным уравнениям будут назначены разные символы.

решение1

Theпгфпакет предоставляет команды \pgfmathdeclarerandomlistи \pgfmathrandomitemдля работы со случайными списками. Поскольку вы, по-видимому, хотите использовать метки уравнений не чаще одного раза, лучшим вариантом будет удаление элементов списка всякий раз, когда они используются, что сложно. К счастью, Марк Виброу дает способ сделать это в своем ответе на вопросКак создать в LaTeX список случайных вопросов, избежав повторений?.

Вооружившись кодом Марка, довольно легко сделать то, что вам нужно, \tagдобавив случайную метку из указанного пользователем списка меток:

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

Вот код:

\documentclass{article}
\usepackage{pgf}
\usepackage{amsmath}

\newcommand\EquationLabels[1]{%
  \pgfmathsetseed{\number\day\number\time}% set a "random" seed based on time
  \pgfmathdeclarerandomlist{equationlabels}{#1}%
}

\newenvironment{Equation}{\equation}%
   {\pgfmathrandomitemwithoutreplacement{\rtag}{equationlabels}\tag{\rtag}\endequation}

% Mark Wibrow: https://tex.stackexchange.com/questions/113987/how-do-i-generate-in-latex-a-list-of-random-questions-avoiding-repetitions
\makeatletter
\def\pgfmathrandomitemwithoutreplacement#1#2{%
    \pgfmath@ifundefined{pgfmath@randomlist@#2}{\pgfmath@error{Unknown random list `#2'}}{%
        \edef\pgfmath@randomlistlength{\csname pgfmath@randomlist@#2\endcsname}%
        \ifnum\pgfmath@randomlistlength>0\relax%
            \pgfmathrandominteger{\pgfmath@randomtemp}{1}{\pgfmath@randomlistlength}%
            \def\pgfmath@marshal{\def#1}%
            \expandafter\expandafter\expandafter\pgfmath@marshal\expandafter\expandafter\expandafter{\csname pgfmath@randomlist@#2@\pgfmath@randomtemp\endcsname}%
            % Now prune.
            \c@pgfmath@counta=\pgfmath@randomtemp\relax%
            \c@pgfmath@countb=\c@pgfmath@counta%
            \advance\c@pgfmath@countb by1\relax%
            \pgfmathloop%
            \ifnum\c@pgfmath@counta=\pgfmath@randomlistlength\relax%
            \else%
                \def\pgfmath@marshal{\expandafter\global\expandafter\let\csname pgfmath@randomlist@#2@\the\c@pgfmath@counta\endcsname=}%
                \expandafter\pgfmath@marshal\csname pgfmath@randomlist@#2@\the\c@pgfmath@countb\endcsname%
                \advance\c@pgfmath@counta by1\relax%
                \advance\c@pgfmath@countb by1\relax%
            \repeatpgfmathloop%
            \advance\c@pgfmath@counta by-1\relax%
            \expandafter\xdef\csname pgfmath@randomlist@#2\endcsname{\the\c@pgfmath@counta}%
        \else%
            \pgfmath@error{Random list `#2' is empty}%
        \fi%
    }}
\makeatletter

\begin{document}

  % set some labels
  \EquationLabels{{$\spadesuit$}{$\heartsuit$}{$\diamondsuit$}{$\clubsuit$}}

  \begin{Equation}1+1=2\end{Equation}

  \begin{Equation}1+2=3\end{Equation}

  \begin{Equation}1+3=4\end{Equation}

  \begin{Equation}1+4=5\end{Equation}

  % a longer list of labels
  \EquationLabels{abcdefghijklmnopqrstuvwxyz}

  \begin{Equation}1+1=2\end{Equation}

  \begin{Equation}1+2=3\end{Equation}

  \begin{Equation}1+3=4\end{Equation}

  \begin{Equation}1+4=5\end{Equation}

\end{document}

Несколько замечаний:

  • Самая сложная часть выполняется кодом Wibrow для\pgfmathrandomitemwithoutreplacement
  • уравнения набираются внутри обычной среды уравнений
  • метки для уравнений задаются с помощью\EquationLabels
  • если уравнений больше, чем меток, то вы получите неинформативную ошибку от PGF Math Error, сообщающую о том, что случайный список equationlabelsпуст.

решение2

Вы можете задать предопределенную последовательность нумерации символов, используя \ifcaseв качестве переопределения \theequation:

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

\documentclass{article}

\renewcommand{\theequation}{%
  \ifcase\value{equation}%
    \or $\spadesuit$% 1
    \or $\heartsuit$% 2
    \or $\clubsuit$% 3
    \or $\diamondsuit$% 4
    \or $\star$% 5
    \or $\alpha$% 6
    \or $\beta$% 7
    \or $\gamma$% 8
    \or $\epsilon$% 9
    \else \arabic{equation}% 10...
  \fi
}

\begin{document}

\begin{equation}  1 +   2 =   3 \end{equation}
\begin{equation}  2 +   3 =   5 \end{equation}
\begin{equation}  3 +   5 =   8 \end{equation}
\begin{equation}  5 +   8 =  13 \end{equation}
\begin{equation}  8 +  13 =  21 \end{equation}
\begin{equation} 13 +  21 =  34 \end{equation}
\begin{equation} 21 +  34 =  55 \end{equation}
\begin{equation} 34 +  55 =  89 \end{equation}
\begin{equation} 55 +  89 = 144 \end{equation}
\begin{equation} 89 + 144 = 233 \end{equation}

\end{document}

Связанный контент