我有一个 LaTeX 文件,它执行外部 shell 命令来获取一些信息;这在我的本地机器上有效,但在 Overleaf 上失败。没关系,没什么大不了的——如果我可以将代码包装在 if-then 条件中,检查它是否在 Overleaf 上执行。
问题:如何检查我的 LaTeX 代码是否在 Overleaf 上运行?
2017-07-31 添加了说明:我已经知道如何测试 shell 转义,并适当地条件化我的代码。问题不在于 shell 转义是否有效;问题实际上是关于测试 Overleaf 与其他环境。
答案1
我认为最简单的解决方案是确定 Overleaf 使用的主路径并对其进行测试。它不太可能与您的本地主路径匹配。
要找到 Overleaf 的主路径:
\documentclass{article}
\makeatletter
\begingroup\endlinechar=-1\relax
\everyeof{\noexpand}%
\edef\x{\endgroup\def\noexpand\homepath{%
\@@input|"kpsewhich --var-value=HOME" }}\x
\makeatother
\begin{document}
HOME: \texttt{\homepath}.
\end{document}
然后复制结果路径并进行测试:
\documentclass{article}
\makeatletter
\begingroup\endlinechar=-1\relax
\everyeof{\noexpand}%
\edef\x{\endgroup\def\noexpand\homepath{%
\@@input|"kpsewhich --var-value=HOME" }}\x
\makeatother
\def\overleafhome{/home/whatever}% change as appropriate
\begin{document}
\ifx\homepath\overleafhome
Overleaf.
\else
Not Overleaf.
\fi
\end{document}
答案2
和其他人一样,我因为路径中包含反斜杠而无法与 Windows 兼容。
我找到了解决方案,方法是结合艾沃·韦尔奇建议查看职位名称这:
\def\StripPrefix#1>{}
\def\jobis#1{FF\fi
\def\predicate{#1}%
\edef\predicate{\expandafter\StripPrefix\meaning\predicate}%
\edef\job{\jobname}%
\ifx\job\predicate
}
\if\jobis{output}%
Overleaf.
\else
Not Overleaf.
\fi
之所以有效,是因为 overleaf 有一个固定的作业名称output
。您的本地构建可能使用.tex
文件名。
编辑:或者,更简洁一点:
\def\StripPrefix#1>{}
\def\isOverleaf{\fi
\def\overleafJobname{output}% overleaf defaults to 'output' as \jobname
\edef\overleafJobname{\expandafter\StripPrefix\meaning\overleafJobname}%
\edef\job{\jobname}%
\ifx\job\overleafJobname
}
\if\isOverleaf%
Overleaf.
\else
Not Overleaf.
\fi