Como posso enviar o nome do arquivo de entrada para localizar o exec corretamente?

3

Eu quero criar dois arquivos de saída pdf de uma única fonte LaTeX.

Um arquivo de saída é público e o outro (com informações adicionais) se torna privado.

Eu uso um arquivo make, que usa find para grep o arquivo tex no diretório. Esta é uma solução simples porque desta forma eu posso reutilizar o makefile para muitos projetos sem precisar modificar seu conteúdo.

Esta é a parte importante do makefile.

all:    
        # This creates the public output file
        find -name *.tex -exec sh -c 'pdflatex {}' \;

Agora quero adicionar outra linha para criar o arquivo de saída particular. Deve ser algo como isto:

all:    
        # This creates the public output file
        find -name *.tex -exec sh -c 'pdflatex {}' \;
        # This creates the private output file
        find -name *.tex -exec sh -c 'pdflatex --jobname=ABC  '\def\privatflag{}\input{XYZ}' {}' \;

Para o ABC, procuro uma solução para especificar o nome do arquivo padrão, mas com um prefixo.

Para o XYZ, procuro uma solução para passar o nome do arquivo de entrada aqui.

O uso das aspas internas também não está correto aqui, eu acho.

Atualização 1 : Talvez eu possa explicar o problema de maneira mais simples.

Este comando funciona no shell de comando:

pdflatex --jobname=outputfile '\def\privatflag{}\input{inputfile.tex}'

Mas estou procurando uma solução para usá-lo com find -name *.tex -exec , para que eu não precise especificar o nome de arquivo intput inputfile.tex.

Além disso, procuro uma maneira que não precise especificar --jobname=outputfile . Ele deve corresponder ao nome do arquivo de entrada com um prefixo adicional.

Atualização 2 : graças ao muru e Stéphane Chazelas , a questão está resolvida.

Esta é agora a parte importante do makefile

all:    
        # This creates the public output file
        find -name *.tex -exec sh -c 'pdflatex {}' \;
        # This creates the private output file
        find . -name '*.tex' -execdir sh -c 'pdflatex --jobname=privat_"$${1##*/}" "\def\privatflag{""}\input{$${1##*/}}"' {}-job {} \;
    
por Neverland 20.12.2015 / 12:32

2 respostas

4

Do seu exemplo, acho que você precisa:

find . -name '*.tex' -execdir sh -c 'pdflatex --jobname=foo"${1##*/}" "\def\privatflag{""}\input{${1##*/}}"' {}-job {} \;

Para dividir:

  • -execdir executa o comando no diretório em que o arquivo foi encontrado.
  • ${1##*/} retira o caminho do argumento dado por find .
  • O "" in {} impede que find substitua {} pelo caminho correspondente.

sh -c é necessário para processar o caminho fornecido por find e extrair apenas o nome do arquivo.

    
por 20.12.2015 / 15:54
4

Como você já está usando um Makefile, pode substituir seus mecanismos find by make para manipular arquivos, assumindo o caso simples de que seus arquivos .tex estejam no diretório atual. Por exemplo, esse makefile pode ser suficiente:

ALLTEX = $(wildcard *.tex)
ALLPDF = $(ALLTEX:.tex=.pdf) $(ALLTEX:.tex=.internal.pdf)

%.pdf: %.tex
        pdflatex $<
%.internal.pdf: %.tex
        pdflatex --jobname=$@ '\def\privatflag{}\input{$<}'

all: $(ALLPDF)

A variável ALLTEX contém os nomes de todos os arquivos de entrada e o ALLPDF converte esses nomes substituindo o sufixo .tex por .pdf e novamente por outro sufixo, portanto, você tem o dobro do número de arquivos de saída desejados.

As próximas 2 linhas configuram uma regra dizendo como gerar um arquivo pdf a partir de um arquivo tex, e as 2 linhas seguintes configuram outra regra para como gerar o outro sufixo. $< será substituído pelo arquivo de entrada e $@ pelo nome do arquivo de saída.

Finalmente, o alvo real all: diz que depende dos arquivos PDF desejados. O uso de regras de criação tem a vantagem de que um arquivo PDF não será recriado se o arquivo tex de origem não tiver sido alterado.

    
por 20.12.2015 / 18:54