\chemfig{} 內的 \input{}

\chemfig{} 內的 \input{}

我可能忽略了這裡的一些基本內容並希望得到一些提示。請參閱插圖 mwe。

為了擁有一個 chemfig 符號庫,我看到了能夠透過命令指向特定符號(儲存在外部 .tex 檔案中)的價值\input{},明顯的構造是:\chemfig[][]{\input{<chemfig symbol library path>/{<symbol name>}}}

\documentclass[preview,border=7pt,active,tightpage]{standalone}
\usepackage{booktabs}
\usepackage{chemfig}
\usepackage{filecontents} 
\usepackage[scaled]{helvet}

%\begin{filecontents}{methane.tex}
%H% 2
%    -[:210]% 1
%              (
%        -[:210]H% 3
%              )
%              (
%        -[:300]H% 5
%              )
%    -[:120]H% 4
%\end{filecontents}

% representation without comments
\begin{filecontents}{methane.tex}
H
    -[:210]
              (
        -[:210]H
              )
              (
        -[:300]H
              )
    -[:120]H
\end{filecontents}

\DeclareRobustCommand{\robustinputcommand}{\input{methane.tex}}

% sans serif font
\renewcommand\familydefault{\sfdefault} 

% define formulae
\def\methane{\mathrm{CH_{4}}}

\begin{document}
\begin{center}
\begin{tabular}[]{lp{1.5cm}}
\toprule
\textbf{Formula} & \textbf{Structure}\\
\midrule%
%$\methane$ & \begin{minipage}[]{1cm} \chemfig{\input{methane.tex}} \end{minipage} \\ [2mm]% gives error
%$\methane$ & \begin{minipage}[]{1cm} \chemfig{\protect\input{methane.tex}} \end{minipage} \\ [2mm]% gives error
%$\methane$ & \begin{minipage}[]{1cm} \chemfig{\robustinputcommand} \end{minipage} \\ [2mm]% gives error
\bottomrule
\end{tabular}
\end{center}
\end{document}

這是我一貫觀察到的錯誤:

! Undefined control sequence.
<everyeof> \_nil 

我嘗試了幾種方法,特別是描述的方法這裡。這些都在 mwe 中評論。

請注意,構造:(\input{<full file path>}文檔級調用)和\chemfig[][]{<content defining symbol>}(外部文檔的通用結構)工作正常,但這並不能立即允許應用格式,例如[scale=0.5]作為文檔級的可選參數\chemfig- 能夠執行以下操作具有明顯的價值:做。

答案1

這是一個\chemfiginput也接受可選參數的命令,例如\chemfig

% representation without comments
\begin{filecontents}{methane.tex}
H
    -[:210]
              (
        -[:210]H
              )
              (
        -[:300]H
              )
    -[:120]H
\end{filecontents}

\documentclass{article}
\usepackage{booktabs}
\usepackage{chemfig}
\usepackage[scaled]{helvet}
\usepackage{catchfile}


% sans serif font
\renewcommand\familydefault{\sfdefault} 

% define formulae
\newcommand\methane{\ensuremath{\mathrm{CH_{4}}}}

\newcommand{\chemfiginput}[2][]{%
  \CatchFileDef{\chemfiginputtemp}{#2}{\csname CF_sanitizecatcode\endcsname}%
  \expandafter\chemfigdo\expandafter{\chemfiginputtemp}{#1}%
}
\newcommand{\chemfigdo}[2]{\chemfig[#2]{#1}}

\begin{document}

\begin{tabular}[]{ll}
\toprule
\textbf{Formula} & \textbf{Structure}\\
\midrule
\methane & \chemfiginput{methane} \\
\methane & \chemfiginput[chemfig style={color=red!40!black, line width=1.5pt}]{methane} \\
\methane & \chemfig{H-[:210](-[:210]H)(-[:300]H)-[:120]H} \\
\bottomrule
\end{tabular}

\end{document}

在此輸入影像描述

答案2

\chemfig{和包含}在 the 中methane.tex而不是用它包圍\input命令顯然似乎有效:

在此輸入影像描述

\documentclass[preview,border=7pt,active,tightpage]{standalone}
\usepackage{booktabs}
\usepackage{chemfig}
\usepackage{filecontents} 
\usepackage[scaled]{helvet}
\usepackage{adjustbox}

\begin{filecontents}{methane.tex}
\chemfig{
H
    -[:210]
              (
        -[:210]H
              )
              (
        -[:300]H
              )
    -[:120]H}
\end{filecontents}


% sans serif font
\renewcommand\familydefault{\sfdefault} 

% define formulae
\def\methane{$\mathrm{CH_{4}}$}

\begin{document}
\begin{center}
\begin{tabular}[]{ll}
\toprule
\textbf{Formula} & \textbf{Structure}\\
\midrule
\methane & \adjustbox{valign=m}{\input{methane.tex}}\\ [2mm]
\bottomrule
\end{tabular}
\end{center}
\end{document}

答案3

\chemfig從外部文件中刪除呼叫的棘手部分.tex是它在讀取其強制參數之前更改類別代碼。為了解決這個問題,我使用\CatchFileDeffromcatchfile套件來保存 的內容,其methane.tex類別代碼設定與 所使用的相同\chemfig

下面的程式碼是通用的,可以毫不費力地用於其他分子。鈦k分子結構列印的 Z 選項可以在中心位置 ( \myprintmol) 指定,並且 : 中沒有冗餘,tabular只需用逗號分隔分子名稱即可:

\documentclass{article}
\usepackage{booktabs}
\usepackage{array}              % for \newcolumntype
\usepackage{collcell}           % for \collectcell
\usepackage{chemfig}
\usepackage{filecontents}
\usepackage{catchfile}          % for \CatchFileDef
\usepackage{adjustbox}          % for \adjustbox
\usepackage{etoolbox}           % for \forcsvlist

% cf. <https://tex.stackexchange.com/a/98011/73317> (Ulrike Fischer)
\DeclareMathAlphabet{\mathup}{T1}{\familydefault}{m}{n}

\newcommand*{\mydeclaremolstruct}[1]{%
  \expandafter\CatchFileDef\expandafter{\csname #1struct\endcsname}{#1.tex}%
     {\csname CF_sanitizecatcode\endcsname}%
}

\newcommand*{\myprintmol}[1]{%
 \begingroup
  % Here, you can customize how molecule structure is printed (TikZ options)
  \setchemfig{chemfig style={color=red!40!black, line width=1.5pt}}%
  %
  \adjustbox{valign=M}{% To align with vertical center of the whole molecule
    \expandafter\chemfig\expandafter{#1}% Process tokenized contents from
  }%                                    % external per-molecule .tex files
  \endgroup
}

\begin{filecontents}{methane.tex}
H
    -[:210]
              (
        -[:210]H
              )
              (
        -[:300]H
              )
    -[:120]H
\end{filecontents}

\mydeclaremolstruct{methane}    % base name of the corresponding .tex file
\newcommand*{\methane}{\mathup{CH}_{4}}

% Special column type for representing the molecule structure
\newcolumntype{M}{>{\collectcell\myprintmol}c<{\endcollectcell}}

\newcommand*{\generatetableline}[1]{%
  $\csname #1\endcsname$ & \csname #1struct\endcsname \\
}

\begin{document}

\begin{tabular}{lM}
\toprule
\textbf{Formula} & \multicolumn{1}{c}{\textbf{Structure}}\\
\midrule
\forcsvlist{\generatetableline}{methane}%
%\forcsvlist{\generatetableline}{methane, ethane, propane}%
\bottomrule
\end{tabular}

\end{document}

螢幕截圖

這是同樣的稍微簡化的,但表建構的自動化程度也稍微低一些:

\documentclass{article}
\usepackage{booktabs}
\usepackage{array}              % for \newcolumntype
\usepackage{collcell}           % for \collectcell
\usepackage{chemfig}
\usepackage{filecontents}
\usepackage{catchfile}          % for \CatchFileDef
\usepackage{adjustbox}          % for \adjustbox

% cf. <https://tex.stackexchange.com/a/98011/73317> (Ulrike Fischer)
\DeclareMathAlphabet{\mathup}{T1}{\familydefault}{m}{n}

\newcommand*{\mydeclaremolstruct}[1]{%
  \expandafter\CatchFileDef\expandafter{\csname #1struct\endcsname}{#1.tex}%
     {\csname CF_sanitizecatcode\endcsname}%
}

\newcommand*{\myprintmol}[1]{%
 \begingroup
  % Here, you can customize how molecule structure is printed (TikZ options)
  \setchemfig{chemfig style={color=red!40!black, line width=1.5pt}}%
  %
  \adjustbox{valign=M}{% To align with vertical center of the whole molecule
    \expandafter\chemfig\expandafter{#1}% Process tokenized contents from
  }%                                    % external per-molecule .tex files
  \endgroup
}

\begin{filecontents}{methane.tex}
H
    -[:210]
              (
        -[:210]H
              )
              (
        -[:300]H
              )
    -[:120]H
\end{filecontents}

\mydeclaremolstruct{methane}    % base name of the corresponding .tex file
\newcommand*{\methane}{\mathup{CH}_{4}}

% Special column type for representing the molecule structure
\newcolumntype{M}{>{\collectcell\myprintmol}c<{\endcollectcell}}

\begin{document}

\begin{tabular}{>{$}l<{$}M}
\toprule
\textbf{Formula} & \multicolumn{1}{c}{\textbf{Structure}}\\
\midrule
\methane & \methanestruct \\
\bottomrule
\end{tabular}

\end{document}

(與上一個螢幕截圖中的輸出相同)。

相關內容