我刚刚编写了一个简单的 shell 脚本来将 LaTeX 表达式保存为 PNG 文件。它工作得很好,除了“下一行”的 LaTeX 语法,即双反斜杠 \\。
例如,当我的输入表达式是这样的:
\left( \begin{array}{cc}1 & 2\\ 3 & 4\end{array} \right)
双反斜杠减少为单反斜杠。我知道我可以在表达式中添加更多反斜杠,但我希望这些表达式是真正的 LaTeX,而不是一些奇怪的 LaTeX-bash 组合。
我的脚本:
#!/bin/bash
if [ $# -ne 2 ]; then
echo -e "Er moeten twee argumenten worden opgegeven:\n(1) LaTeX code\n(2) Bestandsnaam zonder extensie"
else
SaveDir="/home/pieter"
echo "\documentclass{article}\usepackage[utf8x]{inputenc}\pagestyle{empty}\begin{document}\[ $1 \]\end{document}" > /tmp/$2.tex
latex -output-directory /tmp -interaction=batchmode $2.tex
dvips -o /tmp/$2.ps -E /tmp/$2.dvi
convert -units PixelsPerInch -density 200 /tmp/$2.ps -trim $SaveDir/$2.png
fi
那么,我怎样才能忽略转义字符并按字面意思打印我的 LaTeX 表达式呢?最好不使用 sed。
答案1
所有字符均按字面意思解释在单引号之间。您使用了双引号,并且某些字符 ( $"\`
) 在双引号之间进行解释。看
环境变量中的单引号和双引号有何意义?不过,您问题中的示例恰好从未使用有问题的字符。您避免使用的其他潜在问题echo
(echo
内置函数在某些 shell 中执行反斜杠扩展,但在 bash 中则不然,除非您明确启用它),并且$1
(echo $1
会执行反斜杠扩展;echo "$1"
在 bash 中则不会) )。
一种安全、可移植的逐字打印字符串的方法是
printf '%s\n' "$1"
\n
如果您不想在字符串后添加换行符,请将其删除。
这是你真正的代码吗?如果是,请确保问题不在于您传递参数的方式 - 您应该写类似的内容
myscript '\left( \begin{array}{cc}1 & 2\\ 3 & 4\end{array} \right)' filename
如果您需要在 TeX 代码片段中使用单引号,则必须将其转义:'\''
。
您可能感兴趣这里的文档构造,这将允许您方便地在源文件中包含多行字符串。或者您可以在单引号中包含多行字符串。
printf '%s' '\documentclass{article}
\usepackage[utf8x]{inputenc}
\pagestyle{empty}
\begin{document}
\[ '"$1"' \]
\end{document}
' >"/tmp/$2.tex"
请注意,您也应该使用双引号$2
。始终在变量替换周围使用双引号,除非您有充分的理由不这样做。
答案2
如果你想要输出的 TeX 在你的脚本中是固定的,最安全的方法是使用这样的东西:
cat > $2.tex << 'ENDHEADER'
\documentclass{article}
\usepackage[utf8x]{inputenc}
\pagestyle{empty}
\begin{document}
\[
ENDHEADER
echo $1 >> $2.tex
cat >> $2.tex << 'ENDFOOTER'
\]
\end{document}
ENDFOOTER
cat
和标记之间的数据END
将按原样输出,不进行替换。 (我假设添加的所有换行符都可以。)
确保'
在将 TeX 作为参数传递时使用硬引号 ( ):
./your_script '\left( \begin{array}{cc}1 & 2\\ 3 & 4\end{array} \right)'