
Provavelmente estou ignorando algo fundamental aqui e esperava algumas dicas. Por favor, veja o mwe inserido.
Para ter uma biblioteca de símbolos chemfig, vejo valor em poder apontar para um símbolo específico (armazenado em um arquivo .tex externo) por meio do \input{}
comando, sendo a construção óbvia: \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}
Aqui está o erro que observo consistentemente:
! Undefined control sequence.
<everyeof> \_nil
Eu tentei algumas abordagens, particularmente aquelas descritasaqui. Estes são comentados no mwe.
Observe que a construção: \input{<full file path>}
(chamada no nível do documento) e \chemfig[][]{<content defining symbol>}
(estrutura genérica do documento externo) funciona bem, mas isso não permite aplicar imediatamente a formatação, por exemplo, [scale=0.5]
como argumento opcional \chemfig
no nível do documento - algo que há um valor claro em ser capaz de fazer.
Responder1
Aqui está um \chemfiginput
comando que também aceita o argumento opcional como \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}
Responder2
Incluir \chemfig{
e }
em methane.tex
vez de cercar o \input
comando aparentemente parece funcionar:
\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}
Responder3
A parte complicada de remover a \chemfig
chamada dos .tex
arquivos externos é que ela altera os códigos de categoria antes de ler seu argumento obrigatório. Para lidar com isso, eu uso \CatchFileDef
o catchfile
pacote para salvar o conteúdo methane.tex
com a mesma configuração de código de categoria usada por \chemfig
.
O código abaixo é genérico e pode ser usado sem esforço para outras moléculas. TikAs opções Z para impressão da estrutura da molécula podem ser especificadas em um local central ( \myprintmol
) e não há redundância no tabular
: basta separar os nomes das moléculas com vírgulas:
\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}
Aqui está o mesmo um pouco simplificado, mas também um pouco menos automático para a construção da mesa:
\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}
(mesma saída da imagem anterior).