
Мне нужно в общем описать синтаксис случайных буквенно-цифровых последовательностей, скажем, ACW3920
или 39B0Q8
, и обсудить некоторые случаи, например, когда первые две цифры являются буквами, или последовательность заканчивается на BA
, 87
или что-то подобное. Использование X
в качестве символа-заполнителя для букв и N
в качестве символа-заполнителя для чисел приведет к путанице, поскольку некоторые из обсуждаемых случаев обрабатывают последовательности, начинающиеся с X
илиN
: NXNNNN
, категоризация образцов NX9837
, NX9877
, NX123X
(все начинаются с NX
), не сообщает подпоследовательность, которая у них всех общая, и не учитывает цифры, которые могут быть буквойиличисло.
В идеале я бы использовал символы-заполнители, которые однозначно идентифицируют букву-цифру, цифру-цифру или амбивалентную цифру. Есть ли уже используемые символы для такой проблемы (например, ¤
для неуказанной валюты), которые не выглядят слишком странно среди обычных букв? Символы вроде \CIRCLE
и его производные слишком сильно влияют на цвет шрифта и ...
не передают количество цифр.
решение1
Я могу ответить с точки зрения TeX. Моя идея — задать строки в моноширинном шрифте (возможно, выбрать другой, нежели по умолчанию), но «переменные» — это D в рамке или L в рамке для «цифры» и «буквы». Может быть, вы сможете добавить еще один символ для символа, который является либо цифрой, либо буквой.
Главное в этом коде то, что он очень настраиваемый: переменные обозначаются символами ?
и !
(можно выбрать d
и l
, если в строках не используются строчные буквы), преобразование в заключенные в рамку символы происходит путем проверки каждого символа во входных данных на предмет того, представляет ли он «переменную» (заполнитель).
\documentclass{article}
\ExplSyntaxOn
\NewDocumentCommand{\rstring}{m}
{
\group_begin:
\normalfont\ttfamily
\mulmet_rstring:n { #1 }
\group_end:
}
\cs_new_protected:Nn \mulmet_rstring:n
{
\hspace{0.05em}
\str_map_inline:nn { #1 }
{
\str_case:nnF { ##1 }
{
{?}{\mulmet_rstring_placeholder:n { D }}
{!}{\mulmet_rstring_placeholder:n { L }}
}
{ ##1 }
\hspace{0.05em}
}
}
\cs_new_protected:Nn \mulmet_rstring_placeholder:n
{
\dim_set:Nn \fboxrule { 0.3pt }
\dim_set:Nn \fboxsep { 0pt }
\framebox[0.5em]
{
\hspace{-0.3pt}
\vphantom{A}
\normalfont\tiny\raisebox{0.4\height}{#1}
\hspace{-0.3pt}
}
}
\ExplSyntaxOff
\begin{document}
We have the full string \rstring{ACW3920} but also
an incomplete one \rstring{AC????} and one with
\rstring{!!????} two letters and four digits.
\noindent one with \rstring{ABCDEF}
\end{document}
В последней строке я показываю, что строки занимают одинаковое пространство независимо от того, заполнены ли они полностью или содержат заполнители.
Если вы добавите, \usepackage[lighttt]{lmodern}
вы получите