arara:加载本地批处理脚本或将批处理脚本转换为自己的规则

arara:加载本地批处理脚本或将批处理脚本转换为自己的规则

我的问题类似于这里,但它的重点略有不同。我在 Windows 下使用 MikTeX 2.9 工作。

我确实有几个latex项目是工具文档的一部分。每个项目可能会创建多个glossaries文件取决于每个文档中使用的子词汇表的数量。

document.acn
document.glo
document.syg1
document.syg2
...

而不是makeindex单独调用每个glossaries文件

makeindex -s %maintexname%.ist -t %maintexname%.alg -o %maintexname%.acr %maintexname%.acn
makeindex -s %maintexname%.ist -t %maintexname%.glg -o %maintexname%.gls %maintexname%.glo
makeindex -s %maintexname%.ist -t %maintexname%.slg1 -o %maintexname%.syi1 %maintexname%.syg1
makeindex -s %maintexname%.ist -t %maintexname%.slg2 -o %maintexname%.syi2 %maintexname%.syg2
...

我编写了一个批处理脚本create_glossaries.cmd,该脚本适用于项目主文件夹中的makeindex所有acnglo和文件,分别用于首字母缩略词、词汇表和符号。因此,我实际上不必知道明确创建了哪些文件,并且可以对我的所有文档使用相同的批处理脚本。sygilatexglossaries

现在我想切换到构建自动化arara。我基本上可以使用 pdflatex 和 biber 来编译我的文档。但我很难包含词汇表的创建。我当然可以使用以下命令makeindex为每个glossaries文件输入单独的命令

% arara: makeindex: { style: %maintexname%.ist }

但是,这种方法缺乏通用性,我必须glossaries为每个项目指定每个文件。如果可能的话,我想解决这个问题。

因此,我的第一个解决方法是从内部调用批处理脚本arara。但是,我不太明白如何调用批处理脚本,这里是create_glossaries.cmdarara规则中调用的。这怎么可能呢?

为了独立于平台并在我第二个问题支持的所有操作系统上使用相同的方法arara,如何扩展与我的脚本相同的规则,从而找到每个基本glossaries文件并将其转换为正确的输出makeindex

还有一个相关问题:如何arara在主tex文档文件夹而不是arara规则路径中提供可能的新规则?背景是文档是 SVN 存储库的一部分,因此我不知道协作者将文件签latex出的绝对路径。


批处理脚本makeindex

这是文件create_glossaries.cmd

::-----------------------------------------------------------------------------
::
:: Purpose:         Create all glossaries for a tex document
::
:: Conventions:
::
::   - Acronyms:    - Input file extension:     acn*
::                  - Output file extension:    acr*
::                  - Log file extension:       alg*
::
::   - Glossary:    - Input file extension:     glo*
::                  - Output file extension:    gls*
::                  - Log file extension:       glg*
::
::   - Symbols :    - Input file extension:     syg*
::                  - Output file extension:    syi*
::                  - Log file extension:       slg*
::
:: Remarks:         - This script has to be physically present in the tex directory.
::                    A symbolic link does not work.
::
:: Author:          Martin Raedel, DLR-FA-STM, WiMi, 10.02.2016
::-----------------------------------------------------------------------------
::
:: @echo off verhindert Ausgabe Befehlszeilen bis Stapelverarbeitung beendet
@echo off
::
::-----------------------------------------------------------------------------
:: set variables - no spaces between variable name and = allowed
::-----------------------------------------------------------------------------
:: 
:: manual mode:
::set maintexname=Mixed-Dimensional-Coupling
::
:: automatic mode:
set glo_num=2
::
set glo_input_list[0]=acn
set glo_input_list[1]=glo
set glo_input_list[2]=syg
::
set glo_output_list[0]=acr
set glo_output_list[1]=gls
set glo_output_list[2]=syi
::
set glo_log_list[0]=alg
set glo_log_list[1]=glg
set glo_log_list[2]=slg
::
::-----------------------------------------------------------------------------
:: create glossaries
::-----------------------------------------------------------------------------
::
:: Acronyms:
::
::makeindex -s %maintexname%.ist -t %maintexname%.alg -o %maintexname%.acr %maintexname%.acn
::
:: Glossar:
::
::makeindex -s %maintexname%.ist -t %maintexname%.glg -o %maintexname%.gls %maintexname%.glo
::
:: Symbols:
::   manual:
::makeindex -s %maintexname%.ist -t %maintexname%.slg1 -o %maintexname%.syi1 %maintexname%.syg1
::   with automatic symbol input file search
setlocal EnableDelayedExpansion
::
FOR /L %%i IN (0, 1, %glo_num%) DO (
  set inputextension=!glo_input_list[%%i]!
  set outputextension=!glo_output_list[%%i]!
  set logextension=!glo_log_list[%%i]!
  ::echo "inputextension: !inputextension!"
  FOR %%f IN (*.!inputextension!*) DO (
    ::echo %%f
    set fullfilename=%%f
    set filename=%%~nf
    set fileextensionwithdot=%%~xf
    set fileextension=!fileextensionwithdot:~1!
    ::echo "fullfilename: !fullfilename! | fileextension: !fileextension! | !fileextension:~3,1!"
    IF DEFINED fileextension IF "!fileextension:~3,1!"=="" (
      ::echo 3 or less characters
      makeindex -s !filename!.ist -t !filename!.!logextension! -o !filename!.!outputextension! !filename!!fileextensionwithdot! >nul 2>&1
    ) ELSE (
      ::echo more than 3 characters
      set index=!fileextension:~3,1!
      ::echo !index!
      makeindex -s !filename!.ist -t !filename!.!logextension!!index! -o !filename!.!outputextension!!index! !filename!!fileextensionwithdot!>nul 2>&1
    )
  )
)
::
endlocal

想法 1 的解决方案?!

我设法使第一种方法(从自己的arara规则调用批处理脚本)正常工作。我将其添加araraconfig.yaml到我的项目主目录中。

!config
paths:
- '.'

找到我自己的规则文件create_glossaries.yaml

!config
identifier: create_glossaries
name: create_glossaries
commands: 
- name: Create glossaries
  command: <arara> cmd /c create_glossaries.cmd
arguments: 
- identifier: name
  flag: <arara> @{parameters.name}
  default: "create_glossaries"

虽然没有使用该参数,但没有该参数文件就无法工作。

相关内容