读取文件并将其内容存储在变量中

读取文件并将其内容存储在变量中

我正在尝试实现单一来源,以便可以有条件地排版同一篇文档以用于多种用途。这就是我想要做的。

\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,如果失败,它会输出“去买...”行。否则,它会定义\productWindowsLinuxMac并输出“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}

相关内容