我的 LaTeX 文件如何检测它们是否在 Overleaf 上进行编译?

我的 LaTeX 文件如何检测它们是否在 Overleaf 上进行编译?

我有一个 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

相关内容