(Извините, если я неправильно выразился.)
Я хочу написать директиву для arara, которая может принимать аргумент. Директива должна устанавливать имя выходного файла в соответствии со следующими правилами:
- Если аргумент не указан, используйте значение по умолчанию.
- Если аргумент указан, но не имеет значения, используйте
file
переменную. - Если приведен аргумент, используйте его.
Я подумал, что правильным способом сделать это будет:
command: 'echo @{ name == "" ? "default" : name }'
arguments:
- identifier: name
flag: '@{value == "" ? file : value }'
но я получаю: ERROR: Parsing rule '<rulename>' failed. It might be a malformed directive or orb tag syntax.
если я не передам фактический аргумент.
Вот MWE:
!config
# test rule for arara
# author: Andrew Stacey
identifier: echo
name: Echo the value of the argument
command: 'echo @{ name == "" ? "default" : name }'
arguments:
- identifier: name
flag: '@{value == "" ? file : value }'
Затем в своем тестовом документе я пробую одно из следующего:
% arara: echo
% arara: echo: {name: 'something'}
% arara: echo: {name: }
% arara: echo: {name: ''}
Первые два работают, вторые два — нет.
Это возможно?
решение1
С помощью новой 3.x
серии мы можем легко добавить значение по умолчанию к расширению аргумента.
Вот новое echo
правило:
!config
# test rule for arara
# author: Andrew Stacey
# requires arara 3.0+
identifier: echo
name: Echo the value of the argument
command: <arara> echo @{name}
arguments:
- identifier: name
flag: <arara> @{ isTrue( isEmpty( parameters.name ), file, parameters.name ) }
default: <arara> @{file}
Новые концепции:
value
была заменена картой с именемparameters
. Если мы хотим получить доступ, скажем, кone
аргументу директивы, мы просто вызываемparameters.one
вместо того,value
чтобы предполагать значение в контексте аргумента правила.<arara>
используется в начале значений, чтобы просто сэкономить несколько кавычек. Механизм расширения может обнаружить это ключевое слово и безопасно удалить его. Вы по-прежнему можете использовать кавычки, нет никаких проблем.- Теперь аргумент правила может иметь
default
значение, которое будет оценено первым при обработке аргумента. Если аргумент неdefault
указан, механизм устанавливает значение''
(пустая строка). - Теперь у нас есть несколько встроенных функций в контексте правил, которые могут помочь нам написать более лаконичный код:
string isTrue(boolean b, string s1, string s2)
: возвращает,s1
еслиb
равноtrue
, илиs2
в противном случае.boolean isEmpty(string s)
: проверяет,s
пусто ли, и возвращаетboolean
значение:true
еслиs
пусто,false
в противном случае.
Важно отметить, что @{file}
теперь расширяется до имени файла вместо базового имени. Если мы все еще хотим получить базовое имя, для этого также есть встроенная функция: string getBasename(string s)
, @{ getBasename( file ) }
делает это.
Теперь давайте посмотрим на исполнение:
Первое правило: если аргумент не указан, используйте значение по умолчанию.
% arara: echo
\documentclass{article}
...
__ _ _ __ __ _ _ __ __ _
/ _` | '__/ _` | '__/ _` |
| (_| | | | (_| | | | (_| |
\__,_|_| \__,_|_| \__,_|
Running Echo the value of the argument...
teste.tex
Status: SUCCESS
Второе правило: если аргумент задан, но не имеет значения, используйте file
переменную.
% arara: echo: { name: '' }
\documentclass{article}
...
__ _ _ __ __ _ _ __ __ _
/ _` | '__/ _` | '__/ _` |
| (_| | | | (_| | | | (_| |
\__,_|_| \__,_|_| \__,_|
Running Echo the value of the argument...
teste.tex
Status: SUCCESS
Третье правило: если приведен аргумент, используйте его.
% arara: echo: { name: duck }
\documentclass{article}
...
__ _ _ __ __ _ _ __ __ _
/ _` | '__/ _` | '__/ _` |
| (_| | | | (_| | | | (_| |
\__,_|_| \__,_|_| \__,_|
Running Echo the value of the argument...
duck
Status: SUCCESS
Комментарий в исходном ответе о % arara: echo: { name: }
все еще имеет место. Поскольку name
не имеет значения аргумента, экстрактор потерпит неудачу.
Оригинальный ответ оставлен в исторических целях. Он относится кarara 2.x
Как я пропустиларараярлык?:)
К сожалению, вы столкнулись с неприятностью, которая осталась незамеченной во время моих тестовых наборов для выпуска серии 2.x
: единственная переменная, доступная для расширения в arguments
контексте, — это value
сама. Так что, к сожалению file
, и любые другие переменные не будут работать и arara
вызовут ошибку. Надеюсь, в следующей версии эта проблема будет решена.
Также в следующем выпуске у меня есть план отката по умолчанию для аргументов, так что нам не нужно будет писать условные операторы для проверки, установлено ли значение. Но это уже другая история, надеюсь, для новой 3.x
серии.:)
На данный момент единственный способ заставить echo
правило работать — это проверить переменные в command
контексте:
command: 'echo @{ name == "" ? file : name }'
arguments:
- identifier: name
flag: '@{value}'
В новом релизе мы сможем написать следующее:
command: 'echo @{name}'
arguments:
- identifier: name
flag: '@{value}'
default: '@{file}'
Директивы
% arara: echo
% arara: echo: {name: 'something'}
% arara: echo: {name: something}
% arara: echo: {name: ''}
должно работать (последнийимеетработать, если только вы не нашли другую неприятность). :)
Теперь,
% arara: echo: {name: }
не имеет значения аргумента, поэтому экстрактор завершится ошибкой.