SumatraPDF als LaTeX-Betrachter mit Vorwärts- und Rückwärtssuche in Verbindung mit TeXlipse

Sonntag, 31. Oktober 2010, 09:54 Uhr von Christian

Beim Erstellen von Dokumenten mit LaTeX ist eine schnelle und umgängliche Vorschau hilfreich. Das Gespann aus TeXlipse und SumatraPDF finde ich derzeit sehr angenehm, zumal damit Vorwärts- und Rückwärtssuche möglich sind. Das bedeutet, dass man aus dem Editor heraus den Betrachter jeweils an die aktuelle Textposition springen lassen kann und umgekehrt. Somit muss man gerade bei umfangreichen Dokumenten nicht lange suchen. Die entsprechende Konfiguration ist jedoch etwas aufwändig und habe sie daher als kleine Anleitung zur Konfiguration von TeXlipse + SumatraPDF (auf Englisch) zusammengefasst.

Geschrieben in: LaTeX | Schlagwörter: , , , , ,
Keine Kommentare »

Referenzen in LaTeX mit automatischer Objektbezeichnung und Seitenzahl durch Kombination von varioref und cleveref

Sonntag, 15. August 2010, 12:40 Uhr von Christian

Mithilfe der LaTeX-Pakete varioref und cleveref lässt sich der Umgang mit Referenzen stark vereinfachen.

Das cleveref-Paket bietet Befehle, die den Typ des referenzierten Objekts erkennen und der numerischen Referenz auf das Objekt auch dessen Bezeichnung wie „Abbildung“, „Kapitel“, „Abschnitt“, „Tabelle“ usw. voranstellen. Mit dem varioref-Paket stehen Befehle bereit, welche die numerische Referenz um eine Seitenangabe (wie „auf dieser Seite“, „auf der nächsten Seite“ oder „auf Seite 23“) ergänzen. In Kombination dieser Pakete lässt sich allein durch \vref{bild1} z. B. die Ausgabe „Abbildung 1.1 auf Seite 23“ erzeugen.

Ich wollte nun aber, dass bei Referenz auf ein Objekt, das evtl. von LaTeX auf dieselbe Seite gesetzt wird, nicht „auf dieser Seite“ erscheint, weil das einfach den Lesefluss stört. Auch finde ich es überflüssig, darauf hinzuweisen, dass sich etwas „auf der nächsten Seite“ oder „auf der vorherigen Seite“ befindet. Mein Ziel war, eine Seitenangabe nur dann einfügen zu lassen, wenn Objekt und Referenz mindestens zwei Seiten voneinander entfernt sind. Die Lösung war schließlich, einige von varioref bereitgestellte Befehle so umzudefinieren, dass die Seitenangabe unterdrückt wird. Dabei war das größte Problem allerdings, dass wenn durch den vref-Befehl z. B. der Text „Abbildung 1.1 auf Seite 23“ generiert und durch meine Umdefinierung dieses „Seite 23“ unterdrückt wird, das Leerzeichen nach „1.1“ bestehen blieb. Letztendlich war nun die Lösung, dieses evtl. zuvor gesetzte Leerzeichen mittels \unskip zu entfernen.

Ein Beispiel soll meine Intention und die Verwendung der von varioref und cleveref bereitgestellten Befehle veranschaulichen. Es steht im LaTeX-Quellcode und daraus generierter PDF-Datei zum Download zur Verfügung. Die jeweils relevanten Bereiche der Präambel sind im Quellcode durch Kommentare gekennzeichnet, sodass sich diese Funktionalität schnell in das eigene Dokument einfügen lässt.

Geschrieben in: LaTeX | Schlagwörter: , , , , , , , , ,
Keine Kommentare »

Position einer Zeile nach Sortierung ermitteln

Montag, 29. März 2010, 00:28 Uhr von Christian

In einer Tabelle sind Artikel mit Datum versehen, wie z. B.:

item     created
----------------
  1   2010-03-10
  2   2010-03-20
  3   2010-03-21
  4   2010-03-22
  5   2010-03-23
  6   2010-03-25
  7   2010-03-26
  8   2010-03-27
  9   2010-03-28
 10   2010-03-28

Nun soll zu einem bestimmten Artikel ermittelt werden, wie neu er ist, d. h. der wievielte er wäre, wenn alle Artikel nach Datum sortiert werden würden. Beispielsweise soll für den Artikel 8 die Position 3 ausgegeben werden, da er der drittneueste Artikel ist. Das lässt sich mit folgender Abfrage lösen:

SELECT `SortedItems`.`position`
FROM (
  SELECT t.`item`,
         @rowCount := @rowCount + 1 `position`
  FROM   `Test` t,
         (SELECT @rowCount := 0) `dummyTableName_notNeeded`
  ORDER BY `created` DESC
) `SortedItems`
WHERE `SortedItems`.`item` = "8"

In der inneren Abfrage werden nun also alle Artikel absteigend nach Datum sortiert, sodass der neueste Artikel an erster Stelle steht. Dabei wird eine Variable (rowCount) verwendet, die für jeden Artikel die aktuelle Zeilennummer mitzählt und in dem Zwischenergebnis in die Spalte position einträgt. Die Variable rowCount muss zuvor mit 0 initialisiert werden. Die äußere Abfrage liefert dann lediglich die Position des gewünschten Artikels.

Auf diese Lösung hat mich ein alter Kommentar zu dem Thema in einem anderen Blog gebracht.

Für alle, die damit selbst ein wenig spielen möchten, hier die Anweisungen zum Erzeugen und Füllen der Test-Tabelle:

CREATE TABLE `Test` (
  `item` int(11) NOT NULL,
  `created` date NOT NULL,
  PRIMARY KEY (`item`)
);

INSERT `Test` (`item`, `created`) VALUES
(1, '2010-03-10'),
(2, '2010-03-20'),
(3, '2010-03-21'),
(4, '2010-03-22'),
(5, '2010-03-23'),
(6, '2010-03-25'),
(7, '2010-03-26'),
(8, '2010-03-27'),
(9, '2010-03-28'),
(10, '2010-03-28');

Geschrieben in: MySQL | Schlagwörter: ,
Keine Kommentare »

Zellen als Spalten nutzen und Werte zuordnen

Sonntag, 28. März 2010, 19:24 Uhr von Christian

In einer Tabelle sind für zwei fest definierte Kategorien A und B die jeweilige Anzahl zu den Ereignissen x und y wie folgt gegeben:

x  y  category  count
---------------------
1  2      A        10
1  2      B        20
1  3      A       100
1  3      B       200
1  4      A      1000
1  5      B      2000

Nun muss die Struktur zur Auswertung dahingehend geändert werden, dass die Kategorien A und B als Spalten und die jeweilige Anzahl als Wert in den Zeilen, gruppiert nach x und y, bereitstehen. Dazu müssen die Zeilen als Spalten ausgegeben und die jeweils zur Kategorie passende Anzahl, unter Berücksichtigung der Ereignisse, als Wert in diese Spalte geschrieben werden. Auch müssen bisher nicht definierte Anzahlen auf 0 gesetzt werden, sodass das Resultat folgendermaßen aussieht:

x  y    A     B
----------------
1  2    10    20
1  3   100   200
1  4  1000     0
1  5     0  2000

Erreicht werden kann das mit dieser Abfrage:

SELECT
  `x`, `y`,
  SUM(IF(`category` = "A", `count`, 0)) `A`,
  SUM(IF(`category` = "B", `count`, 0)) `B`
FROM `Test`
GROUP BY `x`, `y`

Hierbei wird das Ergebnis nach den Ereignissen x und y gruppiert und dabei für beide Kategorien die entsprechende Summe der Anzahl gebildet.

Das Problem dabei ist jedoch die Beschränkung auf eine vorgegebene Menge von Kategorien. Eine Lösung für variable Werte wäre interessant, lässt sich allerdings (wahrscheinlich) aufgrund der unklaren Anzahl resultierender Spalten nicht allein in SQL realisieren.

Für alle, die damit selbst ein wenig spielen möchten, hier die Anweisungen zum Erzeugen und Füllen der Test-Tabelle:

CREATE TABLE `Test` (
  `x` int(11) NOT NULL,
  `y` int(11) NOT NULL,
  `category` enum('A','B') NOT NULL,
  `count` int(11) NOT NULL
);

INSERT `Test` (`x`, `y`, `category`, `count`) VALUES
(1, 2, 'A', 10),
(1, 2, 'B', 20),
(1, 3, 'A', 100),
(1, 3, 'B', 200),
(1, 4, 'A', 1000),
(1, 5, 'B', 2000);

Geschrieben in: MySQL | Schlagwörter: ,
Keine Kommentare »

Versionsnummer aus SVN-WebDAV-Fußzeile entfernen (mittels ServerSignature für SVN ab 1.6.6)

Freitag, 23. Oktober 2009, 17:36 Uhr von Christian

Seit der vor kurzem erschienenen Version 1.6.6 von Subversion gibt es nun eine einfachere Möglichkeit als bisher, die Versionskennung aus der Fußzeile zu entfernen. Ab Revision 40008 wird nämlich die ServerSignature-Direktive der Apache-Konfiguration ausgewertet, wie aus der Änderungsübersicht hervorgeht. In einem Kommentar an der geänderten Stelle im Quellcode steht lediglich „ServerSignature must be enabled“, im Commit-Kommentar immerhin „If ServerSignature is disabled in apache, do not print Subversion’s version information“. Da ServerSignature jedoch einen der Werte On, Off und EMail annehmen kann, ist nicht ganz klar, was genau mit „enabled“ bzw. „disabled“ gemeint ist und was demnach bei einem Wert von EMail passiert. Da das auch nicht unbedingt aus dem Quellcode ersichtlich ist, habe ich also selbst getestet.

Ergebnis: Die Versionskennung wird nur bei der Einstellung ServerSignature On ausgegeben. Bei den Einstellungen EMail bzw. Off wird die gesamte Fußzeile unterdrückt, anders als mithilfe der Eingangs erwähnten anderen Methode zur Filterung lediglich der Versionsnummer.

Ab Revision 40031 der entsprechenden Datei repos.c ist zusätzlich ein Kommentar vorhanden, der diesen Code-Abschnitt jedoch als eher temporäre Lösung („kludge“) einstuft. Daher sollte man sich nicht völlig darauf verlassen, dass sie immer und auch zukünftig wirkt wie erhofft.

Geschrieben in: Server-Konfiguration | Schlagwörter: , , , , , ,
Keine Kommentare »

Versionsnummer aus SVN-WebDAV-Fußzeile entfernen

Mittwoch, 14. Oktober 2009, 19:15 Uhr von Christian

Beim WebDAV-Zugriff auf ein Subversion-Repository via Browser wird immer eine Fußzeile generiert, welche die Versionsnummer des installierten SVN-Servers enthält, z. B. „Powered by Subversion version 1.5.5 (r34862).“. Meines Wissens kann diese momentan nicht direkt per Konfigurationsdirektive unterdrückt werden. Wer sich also daran gestört fühlt, kann sie durch Einsatz des Apache-Moduls mod_substitute vor Auslieferung der HTML-Seite mithilfe eines regulären Ausdrucks herausfiltern, sodass letztendlich nur noch „Powered by Subversion.“ ausgegeben wird.

Dafür muss zuerst das Modul mit

a2enmod substitute

aktiviert werden. Anschließend kann der folgende Schnipsel an entsprechender Stelle in die Apache-Konfiguration eingefügt werden.

<IfModule mod_substitute.c>
  AddOutputFilterByType SUBSTITUTE text/html
  Substitute "s|(Powered by <[^>]*>Subversion<[^>]*>) version .*\.|$1.|"
</IfModule>

Die Prüfung mit IfModule sorgt dafür, dass der Block nur aktiv wird, falls auch das Modul aktiv ist, da Apache sonst die Übernahme der Konfiguration mit der MeldungInvalid command ‚Substitute‘, perhaps misspelled or defined by a module not included in the server configuration“ verweigert.

Bei mir ist dieser „Hack“ nun seit fast drei Monaten im Einsatz, ohne dass sich Probleme oder Nebenwirkungen gezeigt haben.

Geschrieben in: Server-Konfiguration | Schlagwörter: , , , , , ,
Keine Kommentare »