(용어가 정확하지 않은 경우 사과드립니다.)
나는 인수를 받을 수 있는 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
인수가 처리될 때 가장 먼저 평가되는 값을 가질 수 있습니다. no가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: }
인수 값이 없으므로 추출기가 실패합니다.