我想使用外部程序编写包含值的小型 tex 文件,然后使用\input
siunitx S 列在我的主 tex 文件中显示结果。
假设当前文件夹中存在一个pi_file.tex
以该内容命名的文件。3.141592654
最小(非工作)示例如下:
\documentclass{article}
\usepackage{siunitx}
\usepackage{xcolor}
\begin{document}
\begin{table} \centering
\caption{Table with \texttt{S} column type.}
\begin{tabular}{cS}
\hline
Symbol & {Value} \\
\hline
$\pi$ & \input{pi_file.tex} \\
Red $\pi$ & \color{red} 6.283185307 \\
\hline
\end{tabular}
\end{table}
\end{document}
我认为,宏扩展\input
发生在 siunitx S 列格式化所需的工作之后。我如何才能继续使用pi_file.tex
带有 siunitx S 列的外部文件?
根据评论,我设法在表中加载一个值,但我无法使其成为以文件名作为参数的新命令:
\documentclass{article}
\usepackage{siunitx}
\usepackage{xcolor}
\def\inputval{0}
\newread\inputFile
\openin\inputFile=pi_file.tex
\read\inputFile to \inputval
\closein\inputFile
\begin{document}
\begin{table} \centering
\caption{Table with \texttt{S} column type.}
\begin{tabular}{cS}
\hline
Symbol & {Value} \\
\hline
$\pi$ & \inputval \\
Red $\pi$ & \color{red} 283186.12 \\
\hline
\end{tabular}
\end{table}
\end{document}
答案1
您需要一个可扩展的版本\input
;LaTeX 中的标准版本不是,而 TeX 原始版本\@@input
是。
在这里我使用它filecontents
只是为了使示例自包含(并且不破坏我的文件)。
\begin{filecontents*}{\jobname-pi.tex}
3.141592654
\end{filecontents*}
\documentclass{article}
\usepackage{siunitx}
\usepackage{xcolor}
\usepackage{booktabs}
\makeatletter
\newcommand{\expinput}[1]{\@@input #1}
\makeatother
\begin{document}
\begin{table}
\centering
\caption{Table with \texttt{S} column type.}
\begin{tabular}{cS[table-format=1.9]}
\toprule
Symbol & {Value} \\
\midrule
$\pi$ & \expinput{\jobname-pi.tex} \\
Red $\pi$ & \color{red} 6.283185307 \\
\bottomrule
\end{tabular}
\end{table}
\end{document}
答案2
像这样?
我不确定我是否正确理解了你的问题。无论如何,上表是由以下人员生成的:
\documentclass[margin=3mm,preview]{standalone}
\usepackage{siunitx}
\usepackage{xcolor}
\def\inputval{0}
\newread\inputFile
\openin\inputFile=pi_file.tex
\read\inputFile to \inputval
\closein\inputFile
\usepackage{etoolbox}% <-- new
\newcommand{\sred}{\color{red}} % renew def. for colored font
\robustify\sred
\begin{document}
\begin{table}
\centering
\caption{Table with \texttt{S} column type.}
\begin{tabular}{cS[table-format=1.9]}
\hline
Symbol & {Value} \\
\hline
$\pi$ & \inputval \\
Red $\pi$ & \sred 3.141 592 653 \\
\hline
\end{tabular}
\end{table}
\end{document}
答案3
这可能有助于做你想做的事情:
\documentclass{article}
\usepackage{siunitx}
\usepackage{xcolor}
\usepackage{pgffor}
\usepackage{filecontents}
\begin{filecontents*}{InpFile1.tex}
3.1
\end{filecontents*}
\begin{filecontents*}{InpFile2.tex}
3.14
\end{filecontents*}
\begin{filecontents*}{InpFile3.tex}
13.1415
\end{filecontents*}
\newcounter{myInputCounter}
\newcommand{\myinputcomand}[2]{
\def\inputval{0}
\newread\inputFile
\openin\inputFile=#1\themyInputCounter.tex
\read\inputFile to \inval
\closein\inputFile
\global\expandafter\let\csname #2\themyInputCounter\endcsname\inval
}
%Arguments for ReadNEnumInputFromEnumFiles command:
%1. The number of files (and values) that will be used
%2. The basic name of the files (without the following enumeration and the `.tex` extension)
%3. The basic name of the values (without their enumeration).
\newcommand{\ReadNEnumInputFromEnumFiles}[3]{
\setcounter{myInputCounter}{0}
\foreach \i in {1,...,#1}{\stepcounter{myInputCounter}\myinputcomand{#2}{#3}}
}
\begin{document}
\ReadNEnumInputFromEnumFiles{3}{InpFile}{InVal}
\begin{table} \centering
\caption{Table with \texttt{S} column type.}
\begin{tabular}{cS}
\hline
Symbol & {Value} \\
\hline
Red $\pi$ & \color{red} 13.12 \\
next enumerated &\\
no 1 & \csname InVal1\endcsname\\
no 2 & \csname InVal2\endcsname\\
no 3 & \csname InVal3\endcsname\\
\hline
\end{tabular}
\end{table}
\end{document}
你必须\ReadNEnumInputFromEnumFiles
在桌子前发出命令。
带有参数:
- 将使用的文件数量(和值)
- 文件的基本名称(不含下列枚举和
.tex
扩展名) - 值的基本名称(不包含其枚举)。
然后在表中你必须使用里面的值\csname
(正如你在前一个命令的第二个参数中命名它们并在最后使用它们的编号)
输出: