我正在尝试实现单一来源,以便可以有条件地排版同一篇文档以用于多种用途。这就是我想要做的。
\IfFileExists{../DecMaker.txt}{
var x = DecMaker.txt %the file will contain a single digit number
if x = 0{
\newcommand{\product}{Windows}
}
if x = 1{
\newcommand{\product}{Linux}
}
if x = 2{
\newcommand{\product}{Mac}
}
\product\ computer bought from ThisRandomBrand is amazing!
}
{
Go and buy a \product\ computer from ThisRandomBrand!!
}
我阅读了一些相关内容etoolbox
并尝试使用该\iftoggle
命令。它使用多个 if 使问题变得复杂。
如果您需要更多详细信息,请告诉我。
编辑:我打算在文档中的许多其他位置使用上述变量。例如
if x = 0{
Press the power button and pray that you don't get a blue screen
}
if x = 1{
Congratulations for forwarding the evolution!!
}
答案1
您可以使用catchfile
。最好将辅助文件的读取与定义部分分开,这样您可以轻松地为操作系统重用代码。该宏\newOScommand
有五个参数:要定义的命令的名称和示例中所示的四个分支。
\usepackage{catchfile}
\IfFileExists{../DecMaker.txt}
{\CatchFileEdef{\OSnumber}{../DecMaker.txt}{\endlinechar=-1 }}
{\def\OSnumber{-1}}
\newcommand{\newOScommand}[5]{%
\ifcase\OSnumber\relax
\newcommand{#1}{#2}\or
\newcommand{#1}{#3}\or
\newcommand{#1}{#4}\else
\newcommand{#1}{#5}%
\fi
\newOScommand{\product}{Windows}{Linux}{Mac}{No computer}
答案2
我不确定使用类似的 LaTeX 宏来执行此操作的正确方法\IfFileExists
,但使用低级 TeX 原语很容易做到这一点。
\documentclass{article}
\newread\makerfile
\begin{document}
\openin\makerfile=../DecMaker.txt
\ifeof\makerfile
Go and buy a computer from ThisRandomBrand!!
\else
\read\makerfile to\makerline
\closein\makerfile
\edef\product{%
\ifcase\makerline
Windows%
\or Linux%
\or Mac%
\fi
}
\product\ computer bought from ThisRandomBrand is amazing!
\fi
\end{document}
它会尝试打开../DecMaker.txt
,如果失败,它会输出“去买...”行。否则,它会定义\product
为Windows
、Linux
或Mac
并输出“Linux 计算机...”行(例如)。
我不知道(并且无法轻松测试)如果此文件实际上在 Windows 计算机上运行会发生什么。特别是,我不知道是否将../DecMaker.txt
其视为您想要的路径。
如果DecMaker.txt
移动到同一目录,那么它应该可以在任何地方正常工作。
答案3
运行lualatex
\documentclass{article}
\usepackage{luacode}
\begin{luacode}
local x = {"Windows","Linux","Darwin"}
function FileTest(filename)
local f=assert(io.open(filename, "r"))
local t=f:read()
f:close()
if t then
return x[tonumber(t)].." computer bought from ThisRandomBrand is amazing!"
else
return "Go and buy a computer from ThisRandomBrand!!"
end
end
\end{luacode}
\newcommand\Test[1]{\directlua{tex.print(FileTest("#1"))}}
\begin{document}
\Test{../DecMaker.txt}
\end{document}