Может кто-нибудь объяснить на примере, как работает xparse
- expl3
command ? Здесь важны and ?\str_case:nnF
str
case
Пожалуйста, избегайте длинных (текстовых) ответов. Я думаю, если вы объясните основы, я смогу использовать это где захочу.
решение1
Как можно короче:
\str_case:nnF { <string> }
{
{ <case 1> } { <code 1> }
{ <case 2> } { <code 2> }
...
{ <case n> } { <code n> }
}
{ <false code> }
Команда будет сравнивать <string>
каждую <case n>
строку по порядку, и если найдет совпадение, то выполнится соответствующее <code n>
. Если совпадений не найдено, <false code>
то выполнится.
Пример: предположим, у вас есть макрос, которому пользователь передает некоторые параметры, скажем, above
, center
или below
, и он выполняет некоторый код в зависимости от выбранного параметра и выдает ошибку, если введена какая-то бессмысленная информация:
\cs_new_protected:Npn \cfg_test:n #1
{
\str_case:nnF {#1}
{
{ above } { <'above' code> }
{ center } { <'center' code> }
{ below } { <'below' code> }
}
{ \msg_error:nn { cfg } { invalid-option } {#1} }
}
затем \cfg_test:n {center}
запустится <'center' code>
и \cfg_test: {wrong}
выдаст ошибку (хотя если бы это было для пользовательского интерфейса, l3keys
можно было бы использовать вместо этого).
Анexpl3
команда(переменные разные) имеют имя вида:
\<module>_<name>:<signature>
Там <module>
указано, откуда взялась эта команда: str
это expl3
строковый модуль, поэтому вы знаете, что он \str_case:nnF
работает со строками.
В нем говорится , <name>
что делает команда: case
используется expl3
для функций, которые ведут себя как switch case
конструкции в других языках программирования. expl3
Функции\<whatever>_case:nn(TF)
всегдаимеют тот же общий синтаксис, что и выше: меняется только тип выполняемого сравнения. \int_case:nnF
, например, делает то же самое, но сравнивает целые числа.
Сообщает <signature>
, сколько и какой тип аргументов принимает команда. n
— это обычный {...}
аргумент с разделителем -, F
такой же, как n
, но он выполняется, если команда вычисляется как false
(теперь угадайте, что T
означает). Взгляните наexpl3.pdf
: вы найдете описание всех возможных сигнатур и ядра <modules>
. Затем посмотрите наinterface3.pdf
, где вы найдете описание того, что expl3
делает каждая команда.