[RISOLTO] comando tikz

  • Creatore
    Topic
  • #91766
    Up
    0
    Down
    ::


    Salve a tutti.

    Recentemente per comodità mi sono definito un comando [tt]\freccia[/tt] che utilizzo per disegnare lo spostamento di elettroni in formule chimiche. Il comando funziona bene, ma sono incorso in un piccolo problema: non riesco a spostare la freccia come meglio mi aggrada.

    Mi spiego meglio: il comando prende come argomenti principali i nomi dei due nodi che deve collegare (nodi che vanno posti nella molecola). Traccia una freccia che li collega (la freccia è -stealth o dimezzata a seconda che al comando si dà un asterisco o no). Vorrei sostanzialmente traslare la freccia lungo una direzione perpendicolare alla congiungente ai due nodi, ma non riesco nel mio intento.

    Qualcuno saprebbe consigliarmi cosa devo fare? Non necessariamente codice, anche solo dei link o idee sul da farsi.

    Grazie per l’aiuto.

    Vi allego un file contente il comando completo.

    Di seguito anche un esempio minimo compilabile con il comando interessato. Necessita di due compilazioni.
    `
    \documentclass{article}
    \usepackage{chemfig}
    \makeatletter
    \input{freccia}
    \begin{document}
    \chemfig{-@3(-[:60])(=[@2:-60]@1O-[,,,,,draw=none]@4M)}\freccie{*21,*23,*4[-30]1}
    \end{document}
    `
    Il file [tt]freccia.tex[/tt]
    `
    % freccia parziale sinistra in stile stealth
    \pgfarrowsdeclare{left stealth}{left stealth}
    {
    \pgfutil@tempdima=0.28pt%
    \pgfutil@tempdimb=\pgflinewidth%
    \ifdim\pgfinnerlinewidth>0pt%
    \pgfmathsetlength\pgfutil@tempdimb{.6\pgflinewidth-.4*\pgfinnerlinewidth}%
    \fi%
    \advance\pgfutil@tempdima by.3\pgfutil@tempdimb%
    \pgfarrowsleftextend{+-3\pgfutil@tempdima}
    \pgfarrowsrightextend{+5\pgfutil@tempdima}
    }
    {
    \pgfutil@tempdima=0.28pt%
    \pgfutil@tempdimb=\pgflinewidth%
    \ifdim\pgfinnerlinewidth>0pt%
    \pgfmathsetlength\pgfutil@tempdimb{.6\pgflinewidth-.4*\pgfinnerlinewidth}%
    \fi%
    \advance\pgfutil@tempdima by.3\pgfutil@tempdimb%
    \pgfmathsetlength\pgfutil@tempdimb{5\pgfutil@tempdima-\pgflinewidth}
    \pgfpathmoveto{\pgfqpoint{5\pgfutil@tempdima}{0pt}}
    \pgfpathlineto{\pgfqpoint{-3\pgfutil@tempdima}{4\pgfutil@tempdima}}
    \pgfpathlineto{\pgfpointorigin}
    \pgfpathlineto{\pgfqpoint{0pt}{-.5\pgflinewidth}}
    \pgfpathlineto{\pgfqpoint{\pgfutil@tempdimb}{-.5\pgflinewidth}}
    \pgfusepathqfill
    }
    % freccia parziale destra in stile stealth
    \pgfarrowsdeclare{right stealth}{right stealth}
    {
    \pgfutil@tempdima=0.28pt%
    \pgfutil@tempdimb=\pgflinewidth%
    \ifdim\pgfinnerlinewidth>0pt%
    \pgfmathsetlength\pgfutil@tempdimb{.6\pgflinewidth-.4*\pgfinnerlinewidth}%
    \fi%
    \advance\pgfutil@tempdima by.3\pgfutil@tempdimb%
    \pgfarrowsleftextend{+-3\pgfutil@tempdima}
    \pgfarrowsrightextend{+5\pgfutil@tempdima}
    }
    {
    \pgfutil@tempdima=0.28pt%
    \pgfutil@tempdimb=\pgflinewidth%
    \ifdim\pgfinnerlinewidth>0pt%
    \pgfmathsetlength\pgfutil@tempdimb{.6\pgflinewidth-.4*\pgfinnerlinewidth}%
    \fi%
    \advance\pgfutil@tempdima by.3\pgfutil@tempdimb%
    \pgfmathsetlength\pgfutil@tempdimb{5\pgfutil@tempdima-\pgflinewidth}
    \pgfpathmoveto{\pgfqpoint{5\pgfutil@tempdima}{0pt}}
    \pgfpathlineto{\pgfqpoint{-3\pgfutil@tempdima}{-4\pgfutil@tempdima}}
    \pgfpathlineto{\pgfpointorigin}
    \pgfpathlineto{\pgfqpoint{0pt}{.5\pgflinewidth}}
    \pgfpathlineto{\pgfqpoint{\pgfutil@tempdimb}{.5\pgflinewidth}}
    \pgfusepathqfill
    }

    % freccia spostamento elettroni: la versione asteriscata produce una mezza freccia (un solo elettrone). Due argomenti opzionali \freccia*[1]{2}[3]{4}, l'argomento 1 viene passato a \tikz[1]{}, mentre il secondo (posizione 3) viene usato come angolo di uscita dal nodo in posizione 2 (30° default). L'angolo di entrata è calcolato come complementare di tale angolo sfruttando la chiave “bend left”. In base all'angolo, se presente l'asterisco, viene poi scelto il tipo di mezza freccia da disegnare. In posizione 4, infine, il nodo di arrivo. La freccia va dal nodo 2 al nodo 4.
    \newdimen\shift@freccia
    \tikzset{freccia/.style={-stealth},freccie opt/.style={},shift freccia/.code={\shift@freccia=#1\relax},shift freccia/.default=3em}
    \newif{\iffreccia}

    \newcommand\freccia{\@ifstar{\frecciatrue\freccia@i}{\freccia@i}}

    \def\freccia@i{\@testopt\freccia@ii{}}
    \def\freccia@ii[#1]#2{\@testopt{\freccia@iii[#1]{#2}}{30}}
    \def\freccia@iii[#1]#2[#3]#4{%
    \iffreccia
    \ifnum#3<0\relax
    \tikzstyle{freccia} = [-right stealth]
    \else
    \tikzstyle{freccia} = [-left stealth]
    \fi
    \fi
    \tikz[overlay,remember picture,shorten <=.3ex,shorten >=.2ex,freccia,freccie opt,#1]{
    \draw[cap=round,join=round](#2) to[bend left=#3](#4);}}
    % frecce multiple. Ogni singola freccia va inserita come normale argomento di \freccia
    \newcommand\freccie[2][]{%
    \tikzstyle{freccie opt} = [#1]%
    \def\@freccie{#2}%
    \@for\next:=\@freccie\do
    {\expandafter\freccia\next}}
    `

    Attachments:
    You must be logged in to view attached files.
Visualizzazione 1 filone di risposte
  • Autore
    Risposte
    • #91767
      Up
      0
      Down
      ::

      skevin93″ post=91310Salve a tutti.

      Recentemente per comodità mi sono definito un comando [tt]\freccia[/tt] che utilizzo per disegnare lo spostamento di elettroni in formule chimiche. Il comando funziona bene, ma sono incorso in un piccolo problema: non riesco a spostare la freccia come meglio mi aggrada.

      Mi spiego meglio: il comando prende come argomenti principali i nomi dei due nodi che deve collegare (nodi che vanno posti nella molecola). Traccia una freccia che li collega (la freccia è -stealth o dimezzata a seconda che al comando si dà un asterisco o no). Vorrei sostanzialmente traslare la freccia lungo una direzione perpendicolare alla congiungente ai due nodi, ma non riesco nel mio intento.

      Qualcuno saprebbe consigliarmi cosa devo fare? Non necessariamente codice, anche solo dei link o idee sul da farsi.

      Grazie per l’aiuto.

      Vi allego un file contente il comando completo.

      Di seguito anche un esempio minimo compilabile con il comando interessato. Necessita di due compilazioni.
      `
      \documentclass{article}
      \usepackage{chemfig}
      \makeatletter
      \input{freccia}
      \begin{document}
      \chemfig{-@3(-[:60])(=[@2:-60]@1O-[,,,,,draw=none]@4M)}\freccie{*21,*23,*4[-30]1}
      \end{document}
      `

      Dovresti mostrare come vorresti il risultato per prima cosa. È qualcosa simile a ciò che si ottiene con `
      \freccie{*22,*23,*4[-30]1}
      ` ?

      Siccome si può usare TikZ, ciò che chiedi si può fare sicuramente. Ti puoi accertare se e come vengono definiti i nodi nell’espressione [tt]\chemfig{…}[/tt]? Il problema è solo quello.

      Ciao
      Claudio

    • #91768
      Up
      0
      Down
      ::


      Ti ringrazio per la risposta, ma sono riuscito a risolvere definendo [tt]\freccia@iii[/tt] in questo modo
      `
      \def\freccia@iii[#1]#2[#3]#4{%
      \iffreccia
      \ifnum#3<0\relax
      \tikzstyle{freccia} = [-right stealth]
      \else
      \tikzstyle{freccia} = [-left stealth]
      \fi
      \fi
      \tikz[overlay,remember picture,shorten <=.3ex,shorten >=.2ex,freccia,freccie opt,#1]{
      \scope[every node/.style={above=\shift@freccia,sloped,inner sep=0}]
      \path(#2) –node(start@freccia)[pos=0]{}node(stop@freccia)[pos=1]{} (#4);
      \endscope
      \draw[cap=round,join=round](start@freccia) to[bend left=#3](stop@freccia);}}
      `
      in questo modo mi basta agire sulla chiave [tt]shift freccia[/tt] definita in precedenza e la freccia viene spostata come volevo io. Grazie comunque per il tuo aiuto.

Visualizzazione 1 filone di risposte
  • Devi essere connesso per rispondere a questo topic.

Go to top