
Итак, используя среду уравнений и \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}