[Linguex/philex] Nummern mit Apostroph & geklammerte Kon

Schriftbild, Absätze und Auflistungen einstellen


Rob
Forum-Anfänger
Forum-Anfänger
Beiträge: 18
Registriert: Mo 1. Feb 2010, 14:54

[Linguex/philex] Nummern mit Apostroph & geklammerte Kon

Beitrag von Rob »

Hallo,

ich benutze das Paket linguex in Verbindung mit philex. Ersteres ermöglicht es, bei Beispielen für Sprachwissenschaftler Konstituenten mit einer Klammer samt Label zu umschließen. Normalerweise wird ein Beispiel mit \ex. eingeleitet. Wenn es mit \exi. eingeleitet wird, dann werden Konstitutenten geklammert und mit Label versehen:
\exi. Ich sehe das [obj Objekt].
Bei linguex gibt es keine Möglichkeit modifizierte Beispiele mit einem Apostroph zu versehen. Da hilft philex weiter, das auf linguex aufbaut. Leider erkannt das dann aber die geklammerte Konstituenten nicht mehr. Ein Beispiel mit philex sieht z.B. so aus:
\lb{eins}{Ich sehe das [obj Objekt].}
\lbu{zwei}{eins}{\('\)}{[subj Ich] sehe das Objekt.}
Nochmal zusammengefasst: Philex baut auf linguex auf. Es hat aber diese Funktionalität mit den geklammerten Konstituenten nicht übernommen. Wie kriege ich die wieder zurück?

Hat vielleicht schon mal jemand mit diesen beiden Paketen gearbeitet und hat einen Tipp?

Benutzeravatar
KOMA
TeX-Entwickler
TeX-Entwickler
Beiträge: 2958
Registriert: Fr 4. Jul 2008, 17:28
Kontaktdaten:

Beitrag von KOMA »

Ich habe mit keinem der Pakete irgendwelche Erfahrung und leider hast Du kein vollständiges Minimalbeispiel (← das ist ein geprüfter Link!) gemacht, mit dem ich testen könnte. Rein aus dem Code von linguex könntest Du folgendes (in der Präambel nach dem Laden von linguex) mal ausprobieren, wenn \ex sich immer wie \exi verhalten soll:
% Präambelcode
\makeatletter
\newcommand*{\rawex}{}% sicherstellen, dass das eine neue Anweisung ist
\let\rawex\ex % Ab jetzt kann \rawex an Stelle von \ex verwendet werden
% Jetzt bekommt \ex die Definition von \exi aber mit \rawex statt \ex
\def\ex.#1\par{\indextrue\rawex.#1 | blabla | \indexfalse\par}
\makeatother
Du kannst dann noch immer \rawex an Stelle von \ex verwenden.

Ob das Ganze funktioniert, hängt in erster Linie davon ab, wo überall und wie \ex in den Paketen verwendet wird.

Rob
Forum-Anfänger
Forum-Anfänger
Beiträge: 18
Registriert: Mo 1. Feb 2010, 14:54

Beitrag von Rob »

Danke soweit für Deine Hilfe! Mit Deinem Code klappt es tatsächlich, dass sich ex wie exi verhält. Leider hat das keinen Einfluss auf das Verhalten von lb und lbu. Hier das Minimalbeispiel. Wär cool, wenn Du noch einen Tipp hättest!
\documentclass{article}

\usepackage{linguex}
\usepackage{philex}

% Präambelcode
\makeatletter
\newcommand*{\rawex}{}% sicherstellen, dass das eine neue Anweisung ist
\let\rawex\ex % Ab jetzt kann \rawex an Stelle von \ex verwendet werden
% Jetzt bekommt \ex die Definition von \exi aber mit \rawex statt \ex
\def\ex.#1\par{\indextrue\rawex.#1 | blabla | \indexfalse\par}
\makeatother

\begin{document}

%Mit exi (aus linguex) erscheint der String der direkt auf [ folgt als Subscript.
\exi. Ich sehe das [obj Objekt].

%Mit lb/lbu lässt sich ein modifiziertes Beispiel mit ' markieren. Leider funktioniert die Subscriptfunktion jetzt nicht mehr. Schön wäre es, wenn sich beides kombinieren ließe.
\lb{eins}{Ich sehe das [obj Objekt].}
\lbu{zwei}{eins}{\('\)}{[subj Ich] sehe das Objekt.} 

\end{document}

Benutzeravatar
KOMA
TeX-Entwickler
TeX-Entwickler
Beiträge: 2958
Registriert: Fr 4. Jul 2008, 17:28
Kontaktdaten:

Beitrag von KOMA »

OK, ich sehe das Problem. Probier mal das
\documentclass{article}

\usepackage{philex}

\makeatletter
% Wie \lb aber ohne optionales Argument und mit \exi statt \ex
\newcommand{\lbi}[2]{%
  \ifdim\lastskip=.66\baselineskip
    \vspace{-1.2\baselineskip}%
  \fi
  \immediate\write\@auxout{%
    \unexpanded{%
      \expandafter\gdef\csname#1r\endcsname{#2}%
      \expandafter\gdef\csname#1\endcsname{\ref{#1}}%
      \expandafter\gdef\csname#1p\endcsname{\MakeLowercase#2}%
    }%
  }%
  \expandafter\providecommand\expandafter{\csname#1r\endcsname}{#2}%
  \expandafter\providecommand\expandafter{\csname#1\endcsname}{\ref{#1}}%
  \expandafter\providecommand\expandafter{\csname#1p\endcsname}{%
    \MakeLowercase#2}%
  \exi. #2\label{#2}\p\par
}

% Wie \lbu aber ohne optionales Argument und mit \exi statt \ex
\newcommand{\lbui}[4]{%
  \label{#1}%
  \immediate\write\@auxout{%
    \unexpanded{%
      \expandafter\gdef\csname#1p\endcsname{\MakeLowercase#4}%
      \expandafter\gdef\csname #1\endcsname{\csname#2\endcsname#3}%
      \expandafter\gdef\csname #1r\endcsname{#4}%
    }%
  }%
  \expandafter\providecommand\expandafter{\csname#1p\endcsname}{%
    \MakeLowercase#4}%
  \expandafter\providecommand\expandafter{\csname #1\endcsname}{%
    \csname#2\endcsname#3}%
  \expandafter\providecommand\expandafter{\csname #1r\endcsname}{#4}%
  \exi.[(\csname#2\endcsname#3)\hspace{-1em}] #4\p\par
}

\makeatother

\begin{document}

%Mit exi (aus linguex) erscheint der String der direkt auf [ folgt als Subscript.
\exi. Ich sehe das [obj Objekt].

%Mit lb/lbu lässt sich ein modifiziertes Beispiel mit ' markieren. Leider funktioniert die Subscriptfunktion jetzt nicht mehr. Schön wäre es, wenn sich beides kombinieren ließe.
\lb{eins}{Ich sehe das [obj Objekt]}
\lbi{eins}{Ich sehe das [obj Objekt]}
\lbu{zwei}{eins}{\('\)}{[subj Ich] sehe das Objekt}
\lbui{zwei}{eins}{\('\)}{[subj Ich] sehe das Objekt}

\end{document}
Das optionale Argument bleibt dabei jeweils auf der Strecke, weil sich eine \parbox schlicht nicht mit der Argumentverarbeitung von \ex/\exi verträgt. Wenn das kein Problem ist, könnte obiges weiterhelfen. Für weitere Anweisungen müsste man ggf. ähnlich verfahren.

BTW: Der Code von philex ist der schlimmste Spaghetti-Code, den ich in letzter Zeit gesehen habe. Der sieht aus, als hätte jemand die Wartung absichtlich erschwert, indem er nachträglich alle überflüssigen Leerzeichen und Zeilenumbrüche innerhalb von Makrodefinitionen entfernt hätte. 90% meiner Arbeit bestand darin, den erst einmal lesbar zu formatieren.

Rob
Forum-Anfänger
Forum-Anfänger
Beiträge: 18
Registriert: Mo 1. Feb 2010, 14:54

Beitrag von Rob »

Vielen Dank für Deine Mühe, das funktioniert gut! Ich kann jetzt die geklammerten Konstituenten darstellen und gleichzeitig modifizierte Beispiel mit Apostroph markieren. Dass das optionale Argument nicht mehr verfügbar ist, kann ich verkraften.

Wenn ich gleichzeitig etwas fett oder kursive markieren möchte passiert allerdings etwas Merkwürdiges. Zunächst einmal: Fettdruck ist nur ein Problem mit lbi; mit lbui, lbu und lb funktioniert es. Bei lbi gibt es dann aber allerlei Fehlermeldungen. Hast Du hier vielleicht noch eine Idee?
\documentclass{article}

\usepackage{philex}

\makeatletter
% Wie \lb aber ohne optionales Argument und mit \exi statt \ex
\newcommand{\lbi}[2]{%
  \ifdim\lastskip=.66\baselineskip
    \vspace{-1.2\baselineskip}%
  \fi
  \immediate\write\@auxout{%
    \unexpanded{%
      \expandafter\gdef\csname#1r\endcsname{#2}%
      \expandafter\gdef\csname#1\endcsname{\ref{#1}}%
      \expandafter\gdef\csname#1p\endcsname{\MakeLowercase#2}%
    }%
  }%
  \expandafter\providecommand\expandafter{\csname#1r\endcsname}{#2}%
  \expandafter\providecommand\expandafter{\csname#1\endcsname}{\ref{#1}}%
  \expandafter\providecommand\expandafter{\csname#1p\endcsname}{%
    \MakeLowercase#2}%
  \exi. #2\label{#2}\p\par
}

% Wie \lbu aber ohne optionales Argument und mit \exi statt \ex
\newcommand{\lbui}[4]{%
  \label{#1}%
  \immediate\write\@auxout{%
    \unexpanded{%
      \expandafter\gdef\csname#1p\endcsname{\MakeLowercase#4}%
      \expandafter\gdef\csname #1\endcsname{\csname#2\endcsname#3}%
      \expandafter\gdef\csname #1r\endcsname{#4}%
    }%
  }%
  \expandafter\providecommand\expandafter{\csname#1p\endcsname}{%
    \MakeLowercase#4}%
  \expandafter\providecommand\expandafter{\csname #1\endcsname}{%
    \csname#2\endcsname#3}%
  \expandafter\providecommand\expandafter{\csname #1r\endcsname}{#4}%
  \exi.[(\csname#2\endcsname#3)\hspace{-1em}] #4\p\par
}

\makeatother

\begin{document}

\lb{eins}{\textbf{Text}}
%Fett und kursiv: geht mit lbui
\lbui{zwei-3}{eins}{\('\)}{[subj Ich] \textbf{sehe} \textit{das} Objekt}

%geht nicht mit lbi, egal ob eckige Klammern da sind oder nicht
\lbi{drei}{Ich \textbf{sehe} das Objekt}
\lbi{vier}{[subj Ich] \textbf{sehe} das Objekt}

\end{document}

Benutzeravatar
KOMA
TeX-Entwickler
TeX-Entwickler
Beiträge: 2958
Registriert: Fr 4. Jul 2008, 17:28
Kontaktdaten:

Beitrag von KOMA »

Fehler von mir: \label{#2} in der Definition von \lbi muss naürlich ebenfalls in \label{#1} geändert werden. Sorry, aber das kann schon mal passieren, wenn man ein Makro auf de Schnelle abändert.

Rob
Forum-Anfänger
Forum-Anfänger
Beiträge: 18
Registriert: Mo 1. Feb 2010, 14:54

Beitrag von Rob »

Super, funktioniert. Vielen Dank noch mal!
Wo gibt es eigentlich Informationen darüber, wie man solche Re- und Neudefinitionen von Befehlen schreibt? Ich habe gesucht und in FAQs geschaut, aber bin über eine einfache Definition des Befehls \newcommand nicht hinaus gekommen.

Benutzeravatar
KOMA
TeX-Entwickler
TeX-Entwickler
Beiträge: 2958
Registriert: Fr 4. Jul 2008, 17:28
Kontaktdaten:

Beitrag von KOMA »

Solche Umdefinierungen sind schon etwas für fortgeschrittene Anwender bis hin zu Experten. Im konkreten Fall habe ich mir eben die Originaldefinition aus philex angesehen und erkannt, dass die Fallunterscheidung darin so angelegt ist, dass \ex bzw. \exi gar keine Chance hat, das Wort nach der eckigen Klammer zu erkennen. Allein das dürfte für die meisten normalen LaTeX-Anwender nicht einfach zu erkennen sein. Also habe ich genau diese Stelle passend geändert.

Aber dafür gibt es ja Experten: Damit man sie Dinge fragen kann, die man eben nicht mal eben in einer einfach verständlichen Anleitung oder FAQ findet. Das ist Leuten wie mir auch keineswegs lästig. Das ist der Teil, der uns Spaß macht. Dagegen stehen die Anwender, die glauben, wir wären dazu da, ihnen Anleitungen vorzulesen. Zum 100sten Mal dasselbe zu erklären ist aber weit weniger lustig, als ein echtes Problem zu wälzen.

Daher und weil Du die Sache mit dem vollständigen Minimalbeispiel verstanden hast: Jederzeit gerne wieder.

Rob3
Forum-Newbie
Forum-Newbie
Beiträge: 8
Registriert: Mi 16. Feb 2011, 20:21

Beitrag von Rob3 »

Hallo,

vielen Dank noch mal für die Hilfe, ich habe dieses Feature im Laufe der Zeit vielfach benutzt. Eben bin ich auf MikTex 2.7 umgestiegen und bekomme jetzt leider mit dem Minimalbeispiel (ich hänge es unten noch mal der Einfachheit halber an mit der Änderung des Labels in \lbi) einen Fehler. Nämlich: "l.49 Undefined control sequence <argument> Objekt\p"

Woran kann das liegen? Würde mich über einen Tipp sehr freuen.

Rob
\documentclass{article}

\usepackage{philex}

\makeatletter
% Wie \lb aber ohne optionales Argument und mit \exi statt \ex
\newcommand{\lbi}[2]{%
  \ifdim\lastskip=.66\baselineskip
    \vspace{-1.2\baselineskip}%
  \fi
  \immediate\write\@auxout{%
    \unexpanded{%
      \expandafter\gdef\csname#1r\endcsname{#2}%
      \expandafter\gdef\csname#1\endcsname{\ref{#1}}%
      \expandafter\gdef\csname#1p\endcsname{\MakeLowercase#2}%
    }%
  }%
  \expandafter\providecommand\expandafter{\csname#1r\endcsname}{#2}%
  \expandafter\providecommand\expandafter{\csname#1\endcsname}{\ref{#1}}%
  \expandafter\providecommand\expandafter{\csname#1p\endcsname}{%
    \MakeLowercase#2}%
  \exi. #2\label{#1}\p\par
}

% Wie \lbu aber ohne optionales Argument und mit \exi statt \ex
\newcommand{\lbui}[4]{%
  \label{#1}%
  \immediate\write\@auxout{%
    \unexpanded{%
      \expandafter\gdef\csname#1p\endcsname{\MakeLowercase#4}%
      \expandafter\gdef\csname #1\endcsname{\csname#2\endcsname#3}%
      \expandafter\gdef\csname #1r\endcsname{#4}%
    }%
  }%
  \expandafter\providecommand\expandafter{\csname#1p\endcsname}{%
    \MakeLowercase#4}%
  \expandafter\providecommand\expandafter{\csname #1\endcsname}{%
    \csname#2\endcsname#3}%
  \expandafter\providecommand\expandafter{\csname #1r\endcsname}{#4}%
  \exi.[(\csname#2\endcsname#3)\hspace{-1em}] #4\p\par
}

\makeatother

\begin{document}

\lb{eins}{\textbf{Text}}
%Fett und kursiv: geht mit lbui
\lbui{zwei-3}{eins}{\('\)}{[subj Ich] \textbf{sehe} \textit{das} Objekt}

%geht nicht mit lbi, egal ob eckige Klammern da sind oder nicht
\lbi{drei}{Ich \textbf{sehe} das Objekt}
\lbi{vier}{[subj Ich] \textbf{sehe} das Objekt}

\end{document} 

Rob3
Forum-Newbie
Forum-Newbie
Beiträge: 8
Registriert: Mi 16. Feb 2011, 20:21

Beitrag von Rob3 »

Hallo,

Grund scheint zu sein, dass es eine neue Philex Version gibt, die einige Kommandos verändert. Irgendwann habe ich wohl alle Pakete auf den neuesten Stand gebracht... Habe also den Fehler gefunden und das Problem beheben können.

Antworten