10

I've written a shell script to convert some of my files to different formats for use in my LaTeX files. Is it possible to write an arara rule which can use my shell scripts?

EDIT

I should note: the script is loaded through my bash profile file where it's defined along the lines

myscript () { <script contents> }

In other words, the script does not exist as an executable residing in some directory.

A.Ellett
  • 50,533
  • I'm a little confused... I don't see how your first and last sentences can be true at the same time. Could you clarify? – cmhughes Jun 14 '13 at 21:39
  • @cmhughes Perhaps I'm using the wrong language? In my bash profile I define a number of functions which are callable from the command line. – A.Ellett Jun 14 '13 at 21:59

2 Answers2

11

Yes, this can certainly be done. Thanks to Paulo (arara creator) for his help on this one :)

Let's say that your .bashrc contains the following

function hello() {
   echo "Hello, $0!"
}

export -f hello

Note the use of export to make the hello function available from the command line.

We can then make our arara rule to contain the line

- <arara> bash -i -c hello @{name}

Note the use of the i and c flags. The rule can then be used either as

% arara: hello

or

% arara: hello: {name: Ellett}

hello.yaml

!config
# Hello world
# author: Chris Hughes, Paulo Cereda
# last edited by: cmh, June 14th 2013
# requires arara 3.0+
#
# Sample usage: 
#
# % arara: hello
# % arara: hello: {name: A.Ellett}
#
# This rule is really just a shortcut for commands like the following
#
#   hello
# or
#   hello A.Ellett
#
identifier: hello
name: hello
commands: 
- <arara> bash -i -c hello @{name}
arguments: 
- identifier: name
  flag: <arara> @{parameters.name}
  default: "world"

myfile.tex

% arara: hello
% arara: hello: {name: Ellett}
\documentclass{article}

\begin{document}

test

\end{document}

And here's the output from arara -v myfile.tex

  __ _ _ __ __ _ _ __ __ _ 
 / _` | '__/ _` | '__/ _` |
| (_| | | | (_| | | | (_| |
 \__,_|_|  \__,_|_|  \__,_|

Running hello... 

Hello, world!
Status: SUCCESS

Running hello... 

Hello, Ellett!
Status: SUCCESS
cmhughes
  • 100,947
  • I've copied your example exactly and I when I run it I get bash: no job control in this shell following by Hello, followed by Status: SUCCESS. Notice that nothing followed Hello,; the line was just terminated. I'm doing this on Mac OS X. Is there something special I have to do there? – A.Ellett Jun 15 '13 at 03:12
  • Two things: (1) if I got rid of the -i switch things worked. (2) I'd been using $* instead of $0. – A.Ellett Jun 15 '13 at 03:16
  • I'm wondering if you can make a suggestion for how to get this to work if the bash command takes uses $* instead of $0. – A.Ellett Jun 15 '13 at 21:42
  • 1
    @A.Ellett I'll look into it :) – cmhughes Jun 15 '13 at 22:05
  • Does this need to be updated? I needed to switch to command: ... rather than commands:\n- ... – cfr Nov 29 '16 at 02:18
  • 1
    An adaptation for arara 4.0 can be found at http://tex.stackexchange.com/a/341475/36296 – samcarter_is_at_topanswers.xyz Nov 29 '16 at 12:22
7

In the next version of TeXlive there will be TrY, that is something similar to arara, but simpler. It uses simple bash commands into the TeX comments.

The main use of TrY is to make explicit in the document the list of commands needed to compile it, something like this:

%
%$ xetex -shell-escape filename.tex 
%$ bibtex -min-crossref=3 filename.aux
%$ xetex -shell-escape filename.tex
%$ xetex -shell-escape filename.tex
%

but you can call your script from the comments in the same way:

%
%$ ./myscript $0
%$ pdftex $0
%

where $0 is a placeholder standing for the parameter "this document".

You can also put a script into the comment:

%
%$ while [ $a -le "$LIMIT" ]
%$ do
%$   a=$(($a+1))
%$   if [ "$a" -eq 3 ] || [ "$a" -eq 11 ]
%$   then
%$     continue
%$   fi
%$   echo -n "$a "
%$ done
%
%$ pdftex $0
%

(the script is only an example and has not a particular function or meaning).

Then you have to compile the document in the obvious way:

$ try mydocument.tex
  • I'll look forward to trying this out. – A.Ellett Jun 15 '13 at 17:40
  • 1
    Please allow me to wrote feedback to your answer. TrY is really a nice tool, however I am completely disagree with the statement: but simpler -- what is simpler than arara: pdflatex -- although I see some benefits of TrY. – Marco Daniel Jun 15 '13 at 18:37
  • @MarcoDaniel TrY has not rules, directives, and so on. texdoc arara gives a document 137 pages long; the full manual of TrY can be two pages long or so. – Jean Baldraque Jun 16 '13 at 00:02
  • This looks interesting, but I have to agree with Marco. In addition to his comments, note that arara is a cross-platform tool; is the same true TrY? – cmhughes Jun 16 '13 at 00:32
  • @cmhughes No. TrY is written for linux and works on linux. Arithmetic is not agreee with Marco: 2 pages is a number much lesser than 137. – Jean Baldraque Jun 16 '13 at 00:48
  • 1
    @JeanBaldraque: I agree -- 2 pages against 137 pages (the new version is longer) is a statement ;-)--It's the price for such a tool. – Marco Daniel Jun 16 '13 at 08:33