chemmacros: eigene Tags erstellen? Thema ist als GELÖST markiert

Formelsatz für Mathematik, Naturwissenschaften und Technik


Gast

chemmacros: eigene Tags erstellen?

Beitrag von Gast »

Hallo!

Man kann mit dem chemmacros-Paket eigene Reaktionsgleichungen definieren und auch die Formatierung der Tags ändern, z.B. von {1} zu [R 1]. Das ist auch alles soweit kein Problem. Ist es denn generell möglich, eigene Reaktionsumgebungen mit Eigenen Tags zu kombinieren?
\begin{reaction}
A+B<=>C+D
\end{reaction}
Liefert dann die Gleichung mit dem Tag [R 1].

Ich hätte gerne zusätzlich zu dieser Standardumgebung noch folgendes:
\begin{cell}
A|B||C|D
\end{cell}
[\code]

Das soll die "Gleichung" genau so setzen, wie es die erste Umgebung auch tut, nur als Tag soll [Z 1] erscheinen.

Da ich leider keinen Ansatz hierzu gefunden habe, kann ich kein MWE posten. Daher wäre ich auch für Tipps wonach ich suchen soll dankbar!

Stamm-

Vollständigkeit herstellen

Beitrag von Stamm- »

Die Beschreibung der gewünschten Darstellung und auch der dabei auftretenden Probleme wird durch ein Minimaibeispiel sinnvoll ergänzt und erst damit komplettiert.

Gast

Beitrag von Gast »

Wieso wird eigentlich reflexartig nach einem MWE geschrien, wenn ich doch bereits im Startpost geschrieben habe, dass ich KEINE Ahnung habe wie man das umsetzen könnte. Soll ich jetzt ein leeres Dokument als MWE posten oder was?

Gast

Beitrag von Gast »

Naja, zumindest mir hätte ein Beispiel von dem Code, den Du jetzt schon für reaction hast, geholfen, besser in die Sache reinzukommen. Schließlich hast Du ja schon gewisse Anpassungen durchgeführt, die ich jetzt selbst nachbauen musste. Bei TeX.SE schreibe ich immer, dass ein Beispiel nicht nur sicherstellt, dass alle wirklich über dasselbe reden, und daher schon sinnvoll ist, sondern auch, dass es ein Zeichen der Höflichkeit ist. Die Fragestellerin zeigt damit, dass sie die Zeit der Helferinnen nicht dadurch geringschätzt, dass sie sie zunächst reproduzieren lässt, was bei der schon längst fertig vorhanden ist. In diesem Fall hätte ich wohl nicht nach einem Minimalbeispiel gefragt, ein paar Minuten Arbeit hätte es mir aber schon erspart.

Nun gut, wie dem auch sei. Es scheint mir so, als gäbe es kein Interface, um einfach so eine neue Umgebung mit eigenem, neuen Zähler zu erstellen.
Daher habe ich einigen internen Code von chemmacros kopieren und leicht anpassen müssen. Eventuell wäre das also etwas für ein Feature-Request, wenn Du das häufiger benötigst.
\documentclass[ngerman]{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{babel}
\usepackage{csquotes}
\usepackage{chemmacros}
\usepackage{amsmath}
\usepackage{cleveref}

\chemsetup{modules=reactions}

\chemsetup[reactions]{
  before-tag = R\space,
  tag-open = [ ,
  tag-close = ]
}
\newtagform{cell}[Z ]{[}{]}

% alles aus dem chemmacros-Modul `reactions' geklaut
% und reaction mit cell ersetzt
\makeatletter
\ExplSyntaxOn
\newcounter {chemmacros_save_cell}
\newcounter {cell}

\cs_new_protected:Npn \__chemmacros_begin_cell:
  {
    \patchcmd \thecell {cell} {equation} {} {}
    \cs_set_eq:NN \theequation \thecell
    \cs_set_eq:NN \r@equation \r@cell
    \cs_set_eq:NN \p@equation \p@cell
    \cs_set:Npn \theHequation { C . \theHsection . \theequation }
    \setcounter {chemmacros_save_cell} { \value {equation} }
    \setcounter {equation} { \value {cell} }
    \chemmacros_if_package_loaded:nT {cleveref}
      { \crefalias {equation} {cell} }
    \usetagform {cell}
  }

\cs_new_protected:Npn \__chemmacros_end_cell:
  {
    \setcounter {cell} { \value {equation} }
    \setcounter {equation} { \value {chemmacros_save_cell} }
  }


\tl_new:N \l__chemmacros_cells_args_tl

\cs_new_protected:Npn \__chemmacros_cells_build_args:n #1
  { \tl_put_right:Nn \l__chemmacros_cells_args_tl { {## #1} } }

\cs_new_protected:Npn \chemmacros_define_cell:nnn #1#2#3
  {
    \int_compare:nNnT {#3+0} > {0}
      {
        \tl_clear:N \l__chemmacros_cells_args_tl
        \int_step_function:nnnN {2} {1} {#3+1} \__chemmacros_cells_build_args:n
      }
    \chemmacros_declare_cell_env:nnnV {#1} {#2} {#3} \l__chemmacros_cells_args_tl
  }

% #1: chem
% #2: math
% #3: args number
% #4: argument list ({#2}{#3}...)
\cs_new_protected:Npn \chemmacros_declare_cell_env:nnnn #1#2#3#4
  {
    \exp_args:Nnx \DeclareDocumentEnvironment {#1} { O{} \prg_replicate:nn {#3+0} {m} }
      {
%        \chemmacros_add_reaction_description:n {##1}
        \__chemmacros_begin_cell:
        \chemmacros_reaction_read:nnw {#2} {#4}
      }
      {
        \__chemmacros_end_cell:
        \ignorespacesafterend
      }
  }
\cs_generate_variant:Nn \chemmacros_declare_cell_env:nnnn {nnnV}

\NewChemMacroset* {Cell} {mO{}m}
  { \chemmacros_define_cell:nnn {#1} {#3} {#2} }
\ExplSyntaxOff
\makeatother

\NewChemCell {cell}   {equation}
\NewChemCell {cell*}  {equation*}
\NewChemCell {cells}  {align}
\NewChemCell {cells*} {align*}

\ChemCleverefSupport{cell}{Zelle}{Zellen}%??
\creflabelformat{cell}{#2[#1]#3}

\begin{document}
\begin{reaction}
A+B<=>C+D\label{r}
\end{reaction}

\begin{cell}
A|B||C|D\label{c}
\end{cell}

\cref{r} and \cref{c}

\ref{r} and \ref{c}

\begin{reaction}
A+B<=>C+D
\end{reaction}

\begin{cell}
A|B||C|D
\end{cell}
\begin{cell}
A|B||C|D
\end{cell}
\begin{cell}
A|B||C|D
\end{cell}

\begin{reaction}
A+B<=>C+D
\end{reaction}

\begin{cell}
A|B||C|D
\end{cell}
\end{document}

Gast

Beitrag von Gast »

Danke, das erfüllt seinen Zweck anscheinend perfekt!

Gast

Beitrag von Gast »

Ist aber wie gesagt etwas sehr umständlich. Mit ein paar Änderungen im Paket selbst könnte es wesentlich leichter werden. Wenn Du das also häufiger als dieses eine Mal benötigst, solltest Du auf jeden Fall mal bei https://github.com/cgnieder/chemmacros/issues vorbeischauen und den Vorschlag für eine Erweiterung da lassen. Als Paketautor freut man sich immer, wenn sinnvolle Vorschläge zur Verbesserung kommen, selbst wenn man sie aus nicht sofort umsetzen kann.

Antworten