如何在 Powershell 中使用 $texinputs

如何在 Powershell 中使用 $texinputs

我们有一个多年前为 bash 编写的自定义 LaTeX 构建脚本。它很棒,因为它使用 $texinputs 上的 // 符号来递归添加图像位置(允许我们使用子文件夹而不必每次都输入它们),并且它会拾取本地模板,这样就不必将它们安装在系统上(当使用自定义模板与许多分布式用户一起使用时,这真的很麻烦)。它允许将所有内容放在一个文件夹中,该文件夹是独立的并且易于共享。

该 bash 脚本如下:

#!/bin/bash
# Usage: ./makepdf.sh $tex_file

# Add the files to the search path
export TEXINPUTS=`pwd`:
export TEXINPUTS=`pwd`/references:$TEXINPUTS
if [ -d templates ]; then # Only add templates to path if a template folder is present
    export TEXINPUTS=`pwd`/templates:$TEXINPUTS
fi
if [ -d images ]; then # Only add images to path if an image folder is present
    export TEXINPUTS=`pwd`/images//:$TEXINPUTS
    fi
# Set BIBTeX search path to be the same
export BIBINPUTS=$TEXINPUTS
export BSTINPUTS=$TEXINPUTS


# Create a build directory
if [ ! -d build ]; then
    echo Making build directory 
    mkdir build
fi

# Copy files to the build directory
echo Copying files to build directory
cp $1 ./build

# Calcuate run variables
INPUT=`echo $1 | sed -e 's/.tex//'`

# Run bibtex
cd ./build
echo Running BibTeX
bibtex $INPUT.aux
cd -

# Run latex
# This produces a .dvi file
cd ./build
echo Runnung LaTeX...
latex $1

# Produce a PDFExpress compatible PDF
dvips -Ppdf -G0 -tletter $INPUT.dvi
ps2pdf -dPDFSETTINGS=/printer -dCompatibilityLevel=1.4 -dMAxSubsetPct=100 -dSubsetFonts=true -dEmbedAllFonts=true -sPAPERSIZE=letter $INPUT.ps
cd -

# Moving output files
mv ./build/$INPUT.pdf .

# Display the produced file
acroread -openInNewWindow $INPUT.pdf &

它运行良好,并且已经运行了很长时间。但是,由于各种(不可避免的)原因,我们现在必须在 Windows 上进行开发。我想将上述脚本移至 Powershell,以便以相同的方式完成 LaTeX 构建。当前版本为:

# Usage
# .\makepdf.ps1 -filename $filename.tex

# Set up input arguments
param (
[string]$FILENAME = $(throw "-filename is required.")
)

# Add the files to the search path
$TEXCURRENT = kpsewhich.exe -var-value=TEXINPUTS
$HERE = Get-Location
$TEXINPUTS = $HERE.Path + ";" + $TEXCURRENT
$TEXINPUTS = $HERE.Path + "\references" + ";" + $TEXINPUTS
if(Test-Path -Path .\templates){
    $TEXINPUTS = ".\templates" + ";" + $TEXINPUTS
}
if(Test-Path -Path .\images){
    $TEXINPUTS = ".\images//" + ";" + $TEXINPUTS
}
Write-Host $TEXINPUTS

# Set BIBTeX search path to be the same
$BIBCURRENT = kpsewhich.exe -var-value=BIBINPUTS
$BIBINPUTS = $TEXINPUTS + ";" + $BIBCURRENT
$BIBCURRENT = kpsewhich.exe -var-value=BSTINPUTS
$BSTINPUTS = $TEXINPUTS + ";" + $BSTCURRENT

# Create a build directory
if(!(Test-Path -Path .\build)){
    Write-Host “Making build directory”
    New-Item -ItemType directory -Path ".\build" | Out-Null
}

# Copy files to the build directory
Write-Host “Copying files to build directory”
cp "*.tex" .\build

# Calculate run variables
$INPUT = [System.IO.Path]::GetFileNameWithoutExtension($FILENAME)

# Run Biber
cd .\build
biber.exe $INPUT
cd ..\

# Run LuaLaTeX
cd .\build
lualatex.exe $INPUT
cd ..\

# Move output files
cp -Force ".\build\$INPUT.pdf" .\

# Display output file
Start-Process "$INPUT.pdf"

但是我无法识别 texinputs 环境变量。它无法添加图像文件夹,更不用说递归文件夹了,也无法拾取建议的模板文件夹。

我知道直接修改 texinputs 会有一些缺点。我愿意接受其他建议,只要最终结果是它们以相同的方式工作。我想我应该通过 kpsewhich.exe 来修改它,但我不知道该怎么做。

任何建议,将不胜感激。

答案1

我使用 Makefile

SHELL=C:/windows/System32/WindowsPowershell/v1.0/powershell.exe

遇到了同样的问题。我的 Makefile 导出了TEXINPUTS,但没有任何效果,每次 *tex 运行都失败了。事实证明,不仅TEXINPUTS受影响,而且我喜欢使用的每个环境变量都受影响。

pdflatex.exe为了补救这种情况,我用变量替换了接收器中对(例如)的每次调用,即$(RUN_PDFLATEX)

首先,我构建变量,就像您在 PS 脚本中所做的那样,然后我放入定义RUN_PDFLATEX,以便它在调用编译器之前定义环境。

RUN_PDFLATEX我在 Makefile 中的定义:

RUN_PDFLATEX := $$TEXINPUTS="$(TEXINPUTS)"; $$BIBINPUTS="$(BIBINPUTS)"; $$BSTINPUTS="$(BSTINPUTS)"; $$OSFONTDIR="$(OSFONTDIR); pdflatex.exe

在 Makefile 中$(<variable name>)生成变量的内容并$$生成单个$。因此,每次使用时,$(RUN_PDFLATEX)我实际上都会发出 powershell 命令

$TEXINPUTS="/my/paths//:/some/more/paths//"; $BIBINPUTS="/my/paths//:/some/more/paths//"; $BSTINPUITS="/my/paths//:/some/more/paths//"; $OSFONTDIR="/my/paths//:/some/more/paths//"; pdflatex.exe

这对我来说很有效。

相关内容