Jump to content

Sky Slate Blueberry Blackcurrant Watermelon Strawberry Orange Banana Apple Emerald Chocolate
Photo

Mehrzeiliger Latex Code mit Sprungmarken


  • Please log in to reply
14 replies to this topic
thorolli
  • Members
  • 7 posts
  • Last active: Aug 02 2013 07:17 PM
  • Joined: 26 Jul 2013

Hallo,

 

ich bin noch neu und unerfahren im Umgang mit Autohotkey und hoffe, dass mir jemand hier helfen kann, auch wenn's wahrscheinlich ganz einfach ist. Ich versuche seit gestern ein kleines Script zu schreiben, was folgendes macht:

 

:*:desc#::\begin{{}description{}}`r\item[]`r\item[]`r\item[]`r\end{{}description{}}{UP 3}{LEFT}

 

1. Frage:

 

wenn ich nun desc# eingebe, wird das Script ausgeührt und er springt in das erste Feld, soweit so gut. Nun möchte ich aber per Tab vorwärts in die anderen Felder springen und mit Shft-Tab wieder zurück springen können, wie geht das ?

 

2. Frage:

der Code wird noch deutlich länger, deshalb möchte ich ihn in mehrere Zeilen untereinander schreiben können, also habe ich versucht das Ganze zu klammern, die Sprungmarken sollen dabei natürlich erhalten bleiben:

 

:*:desc#::

(

Code...

Code...

)

 

Das geht aber nicht, und es kommt immer eine Fehlermeldung.

 

Könnte mir jemand einen Tipp geben?

 

Vielen Dank!

 

Gruß

 

Thorsten

 



hd0202
  • Members
  • 709 posts
  • Last active: Feb 14 2016 08:05 PM
  • Joined: 13 Aug 2006

Ich kenne zwar LaTex, aber da ich nicht damit arbeite, kommt mir deine Anfrage wie "böhmische Dörfer" vor, anders gesagt, ich verstehe nur "Bahnhof".

 

Trotzdem kann ich dir einen Tipp geben:

 

Zeige hier doch "eine Fehlermeldung" (AutoHotkey hat ja leider mehrere, wie ich aus eigener Erfahrung weiss), vielleicht kann dir daraufhin ein Anderer einen besseren Tipp gebenunsure.png

 

Hubert



nnnik
  • Members
  • 1625 posts
  • Last active: Jan 24 2019 02:19 PM
  • Joined: 28 Jul 2012

Hi hinter jede Sprunmarke muss ein return:

abc::abcdefghijklmnoprstuvwxyz ;oder
abc::
send,abcdefghijklmnopqrstuvwxyz
return ;oder
abc::
 send,a
send,b
send,c
send,d
;...
return

Edit zu Langsam


Visit the new forum ahkscript.org.

http://ahkscript.org


thorolli
  • Members
  • 7 posts
  • Last active: Aug 02 2013 07:17 PM
  • Joined: 26 Jul 2013

Vielen Dank für die schnellen Antworten, das werde ich mal ausprobieren aber nicht mehr heute, hier sind's 35 Grad unter dem Dach wink.png und mich dann wieder melden, wollte nur kurz Bescheid geben, dass ich die Antworten gelesen habe happy.png

 

Viele Grüße

 

Thorsten



thorolli
  • Members
  • 7 posts
  • Last active: Aug 02 2013 07:17 PM
  • Joined: 26 Jul 2013

Ich glaube, ich bin zu blöd dafür,

ich habe folgendes ausprobiert:

 

y::
send, A[] Text`n
send, B[] Text`n
send, C[] Text`n
;
return

 

so, wenn ich jetzt y drücke, wird das Snippet einfach eingefügt aber er geht nicht in die einzelnen Sprungmarken, hier [] .....er soll der Reihe nach

in die Sprungmarken gehen und dort darauf warten, dass ich Text eingebe, dann soll er mit Tab in die nächste Marke springen...

 

ich danke euch schonmal für eure Geduld sad.png

 

VG

 

Thorsten



strobo
  • Members
  • 359 posts
  • Last active: Mar 10 2015 08:13 PM
  • Joined: 19 Jun 2012

nnnik hat dir nur zeigen wollen, welche Syntax man verwenden kann, IMHO.
Hier ist mal ein Ansatz:

esc::exitapp
^tab::
    loop {
        clipboard := ""
        send +^{right}^c
        clipwait 2
        pos := instr(clipboard, "\item[")
    } until pos or a_index > 50
    if (pos)
        send % "{right}{left " (strlen(clipboard)-pos-5) "}"
return

Regards,
Babba

nnnik
  • Members
  • 1625 posts
  • Last active: Jan 24 2019 02:19 PM
  • Joined: 28 Jul 2012

Das Problem ist ja, dass ein anderer Send-Befehl genutzt wird.

Dafür könnte man eine Art Funktion schreiben.

Du musst allerdings genau und so einfach wie möglich beschreiben was er dort tun soll z.B.

Eine [] Zeichenfolge ist eine Sprungmarke.

Wenn ich in diesem Abschnitt bin kann ich Text eingeben.


Visit the new forum ahkscript.org.

http://ahkscript.org


thorolli
  • Members
  • 7 posts
  • Last active: Aug 02 2013 07:17 PM
  • Joined: 26 Jul 2013

 

nnnik hat dir nur zeigen wollen, welche Syntax man verwenden kann, IMHO.
Hier ist mal ein Ansatz:

esc::exitapp
^tab::
    loop {
        clipboard := ""
        send +^{right}^c
        clipwait 2
        pos := instr(clipboard, "\item[")
    } until pos or a_index > 50
    if (pos)
        send % "{right}{left " (strlen(clipboard)-pos-5) "}"
return

 

Das klappt gut, er springt von [] zu [], genauso wie er soll, klasse! Könnte man die Funktion noch ein wenig erweitern? Interessant scheint mir ja diese Zeile zu sein:

 

pos := instr(clipboard, "\item[")

 

ich habe mal probiert, die Zeile zu erweitern, indem ich einfach "\title{" angefügt habe, das klappt aber leider nicht. Im Prinzip macht die Funktion genau das, was sie soll, es müssten halt nur noch einige Tags dazu kommen. Geht das?

 

Herzlichen Dank schonmal für die Hilfe shy.png 

 

VG

 

Thorsten



nnnik
  • Members
  • 1625 posts
  • Last active: Jan 24 2019 02:19 PM
  • Joined: 28 Jul 2012

Ah jetzt hab ich verstanden was du willst.
/item [] ist ein Text der Bereits dort steht...
OK gehen wir mal die Funktion durch

    loop {
        clipboard := ""
        send +^{right}^c
        clipwait 2
        pos := instr(clipboard, "\item[")
    } until pos or a_index > 50
    if (pos)
        send % "{right}{left " (strlen(clipboard)-pos-5) "}"

Das ist der interesantere Part.

  •  
  • Das Script leert zuerst die Clipboard Variable also die Zwischenablage:clipboard := ""
  • Danach wird ein Tastenbefehl ausgelös t:send +^{right}^c  = shift+ctrl+rechts und ctrl+c
  • Danach wird gewartet bis das die Zwischenablage Informationen enthält: clipwait 2
  • Danach wird innerhalb der Zwischenablage gesucht ob sich dort der Zwischenablage der Text (String) "\item[" befindet
  • Das Ergebnis davon also die Position des Strings (Textes) "\item["  wird in der Variable pos gespeichert:        pos := instr(clipboard, "\item[")

Dieser ganze Teil steckt in einem Loop :loop {
Dieser Loop läuft so lange bis er entweder 50 mal gelaufen ist oder pos eine wahren (True) Inhalt hat. : } until pos or a_index > 50
Ein Inhalt ist dann True wenn es kein leerer String ("") oder keine 0 ist.
 
Wenn die Variable Pos einen wahren Inhalt hat dann wird die Tastenkombi Rechts und strlen(clipboard)-pos-5) mal links gedrückt:
    if (pos)
        send % "{right}{left " (strlen(clipboard)-pos-5) "}"
 

esc::exitapp
^tab::
    loop {
        clipboard := ""
        send +^{right}^c
        clipwait 2
        pos := instr(clipboard, "\item[")
    } until pos or a_index > 50
    if (pos)
        send % "{right}{left " (strlen(clipboard)-pos-5) "}"
return

Wenn man dieses Script nun erweitern möchte muss man nach den anderen Tags sucht und sich deren Position speichert.
Du musst also Schritt 4und 5 wiederholen für die anderen Tags und die unnummerrierten Schritte 5 und 6verändern sowie 7 für dieses Tag wiederholen.

 

Beispiel:

Wir fügen nun den Tag %% hinzu dort soll die Zahl 100 hinzugefügt werden.

esc::exitapp
^tab::
    loop {
        clipboard := ""
        send +^{right}^c
        clipwait 2
        pos := instr(clipboard, "\item[")
        pos2:= instr(clipboard, "%%")-1
    } until pos or pos2 or a_index > 50
    if (pos)
        send % "{right}{left " (strlen(clipboard)-pos-5) "}"
    if (pos2)
        send % "{right}{left " (strlen(clipboard)-pos-5) "}100"
return

Visit the new forum ahkscript.org.

http://ahkscript.org


thorolli
  • Members
  • 7 posts
  • Last active: Aug 02 2013 07:17 PM
  • Joined: 26 Jul 2013

@nnnik

 

ganz kurz, ich schaue gerade Dortmund gegen Bayern wink.png

 

1. Ihr macht euch echt viel Mühe hier, das finde ich klasse, tolles Forum!!

 

2. Entschuldigung, ich bin so sehr  mit der Latex-Syntax vertraut, dass ich mich wahrscheinlich nicht klar ausgedrückt habe. Ja, alles, was bei Latex mit einem "\" beginnt ist meistens ein Formatierungsbefehl, optionaler Text befindet sich entweder in eckigen Klammern "[Optionaler Text]" oder in geschweiften Klammern "{Text}" und ist daher variabel. Die Befehle sind natürlich als Text vorgegeben. Ein Beispiel wäre \textbf{Text} Dieser Befehl bewirkt, dass "Text" in den geschweiften Klammern fett formatiert wird. Ein anderes Beispiel wäre eine Listenumgebung:

 

\begin{description} = Befehl zum Öffnen der Umbebung

  \item[Text] \item= 1 Punkt der Umgebung, Text = variabel

  ...

\end{description} = Befehl zum Schließen der Umgebung

 

Das ist natürlich grob verallgemeinert und nicht vollständig aber so versteht man es besser, ich hoffe es wird jetzt klarer!

 

3. Zu deinem Script: das muss ich mir erst mal in Ruhe ansehen und verdauen, ich kann zwar Latex ziemlich gut aber die Syntax von AHK ist mir doch noch sehr fremd aber da fress ich mich schon durch!

 

Ich melde mich morgen nochmal!

 

Herzliche Grüße

 

Thorsten

 

 

nnnik
  • Members
  • 1625 posts
  • Last active: Jan 24 2019 02:19 PM
  • Joined: 28 Jul 2012

Wenn das so ist musst du mit RegExMatch arbeiten.

Siehe Hilfe.


Visit the new forum ahkscript.org.

http://ahkscript.org


thorolli
  • Members
  • 7 posts
  • Last active: Aug 02 2013 07:17 PM
  • Joined: 26 Jul 2013

Wollte mich nur kurz zurückmelden: Ich habs hinbekommen, ob das nun die eleganteste Lösung ist, weiß ich nicht aber so sieht die Funktion nun erst einmal aus und sie funktioniert:

^tab::
	loop {
		clipboard := ""
        send +^{right}^c
        clipwait 2
        pos := instr(clipboard,  "\examNum{")
		pos1 := instr(clipboard, "\title{")
		pos2 := instr(clipboard, "\subject{")
		pos3 := instr(clipboard, "\author{")
		pos4 := instr(clipboard, "\date{")
		pos5 := instr(clipboard, "\altTitle{")
		pos6 := instr(clipboard, "\keywords{")
		pos7 := instr(clipboard, "[Klassenarbeit Nr. ")
	} until pos or pos1 or pos2 or pos3 or pos4 or pos5 or pos6 or pos7 or a_index > 50
    if (pos)
	send % "{right}{left " (strlen(clipboard)-pos-8) "}"
	if (pos1)
	send % "{right}{left " (strlen(clipboard)-pos1-6) "}"
	if (pos2)
	send % "{right}{left " (strlen(clipboard)-pos2-8) "}"
	if (pos3)
	send % "{right}{left " (strlen(clipboard)-pos3-7) "}"
	if (pos4)
	send % "{right}{left " (strlen(clipboard)-pos4-5) "}"
	if (pos5)
	send % "{right}{left " (strlen(clipboard)-pos5-9) "}"
	if (pos6)
	send % "{right}{left " (strlen(clipboard)-pos6-9) "}"
	if (pos7)
	send % "{right}{left " (strlen(clipboard)-pos7-18) "}"
return

Ich benutze die Funktion, nachdem ich diesen Textbaustein eingegeben habe und springe dann von Platzhalter zu Platzhalter:

:*:ka#::% Präambel`r\documentclass[fontsize=11pt,fleqn,parskip=half*]{{}scrartcl{}} `r\usepackage{{}KlassenarbeitEQ{}}`r\usepackage{{}kpfonts{}}`r`r% Seiteneinstellungen`r\usepackage[paper=a4paper,driver=pdftex,`rleft=15mm,right=25mm,top=20mm,bottom=25mm]{{}geometry{}}`r`r% Eqexam`r\usepackage[%`rusecustomdesign,myconfigi,pdftex,`rpointsonright,noparttotals,links`ruseforms,forcolorpaper,usexkv,`r%`r% Ohne Lösungen`rnosolutions`r%`r% Lösungen nach den Aufgaben`r%answerkey`r%`r% Nur Musterlösung`r%solutionsonly,nospacetowork`r%`r% Sonderoption zum Testen`r%vspacewithsolns`r]{{}eqexam{}}`r`r\colorlet{{}tableblackheadcolor{}}{{}black{!}60{}}`r\usepackage{{}colortbl{}}`r\usepackage{{}tikz{}}`r\usepackage{{}pgfplots{}}`r`r% Einstellungen pgfplot`r\pgfplotsset{{}compat=newest{}}`r\pgfplotsset{{}every axis/.append`rstyle={{}font=\sffamily\footnotesize{}}{}}`r\pgfplotsset{{}every axis/.append`rstyle={{}font=\sffamily\footnotesize{}}{}}`r\pgfplotsset{{}every axis label/.append`rstyle={{}font=\bf\sffamily\footnotesize{}}{}}`r\pgfplotsset{{}every tick/.append`rstyle={{}thick,black{}}{}}`r% Keine Linie bei multicols`r\setlength{{}\columnseprule{}}{{}0pt{}}`r`r% Titel, Daten zur Arbeit`r% Klausur Nr`r\examNum{{}{}}`r% Fach`r\title{{}{}}`r% Klasse`r\subject{{}{}}`r% Fachlehrer`r\author{{}{}}`r% Datum`r\date{{}{}}`r% Zeit`r\altTitle{{}{} Minuten{}}`r% Themengebiete`r\keywords{{}{}}`r\vspacewithkeyOn`r`r\begin{{}document{}}`r\maketitle`r`r\begin{{}exam{}}[Klassenarbeit Nr. ]{{}{}}{UP 19}  

allerdings ist mir aufgefallen, dass der zugegebenermaßen ziemlich große Textbaustein relativ langsam eingegeben wird, man merkt deutlich, dass AHK da einiges zu tun hat, man kann förmlich zusehen, wie Zeile für Zeile auf dem Bildschirm erscheint. Nutzt man einen Snippetmanager eines Texteditors z.B. Vim geht das erheblich schneller, woran liegt das?

 

Herzliche Grüße

 

Thorsten



strobo
  • Members
  • 359 posts
  • Last active: Mar 10 2015 08:13 PM
  • Joined: 19 Jun 2012

Edit:
Den hotstring könntest du beschl. indem der text ins Clipboard geladen wird und dann ^v gesendet wird.


Regards,
Babba

nnnik
  • Members
  • 1625 posts
  • Last active: Jan 24 2019 02:19 PM
  • Joined: 28 Jul 2012

allerdings ist mir aufgefallen, dass der zugegebenermaßen ziemlich große Textbaustein relativ langsam eingegeben wird, man merkt deutlich, dass AHK da einiges zu tun hat, man kann förmlich zusehen, wie Zeile für Zeile auf dem Bildschirm erscheint. Nutzt man einen Snippetmanager eines Texteditors z.B. Vim geht das erheblich schneller, woran liegt das?

 

SetBatchlines,-1

AHK wartet alle paar Zeilen 20 milisekunden.

Mit dem oben genannten Befehl schaltest du diese Funktion aus und ermöglichst eine höhere Geschwindigkeit.


Visit the new forum ahkscript.org.

http://ahkscript.org


thorolli
  • Members
  • 7 posts
  • Last active: Aug 02 2013 07:17 PM
  • Joined: 26 Jul 2013

Danke, das hat schon mal einiges gebracht, ich teste noch ein wenig weiter und melde mich wieder, wie gesagt, ich bin es nicht gewohnt so viel Hilfe zu bekommen, klasse

 

vg

 

Thorsten