Hallo,

ich suche nach einem Befehl, der mir innerhalb eines zweispaltigen Textbereichs (\twocolumn ohne multicol.sty) zuverlässig sagt, in welcher Spalte ich mich befinde. Gerne darf das über einen Label-Ansatz passieren, also etwas wie

Öffne in Overleaf
\ref{asdf}
...
\columnref{asdf}

Bei StackExchange habe ich den Beitrag "\pageref, but for columns" (https://tex.stackexchange.com/questions/159481/pageref-but-for-columns/159643#159643) gefunden, der im Prinzip das tut, was ich möchte, aber leider nicht zuverlässig. Am Anfang einer neuen Spalte wird häufig zunächst noch die Spaltennummer der alten Spalte geliefert (was im Beitrag auch angekündigt wird).

Der Ansatz basiert auf:

Öffne in Overleaf
\newcommand*\collabel[1]{\begingroup
    \protected@write\@auxout{}{\string\newlabel{col:#1}{{\if@firstcolumn 1\else 2\fi}{}{}{}{}}}\endgroup}

Alternativ könnte ich auch eine Funktion in multicol anwenden, habe aber in der Doku nichts gefunden.

Hat jemand von euch eine Idee, wie man eine zuverlässig richtige Spaltenzahl erhält?

Viele Grüße Harald

gefragt 09 Mai, 08:07

Harders's gravatar image

Harders
111
Akzeptiert: 0%

bearbeitet 09 Mai, 23:39

Henri's gravatar image

Henri
14.4k53138

@Harders Eine Idee könnte sein:
1. Zeilennummern ergänzen (etwa lineno.sty), Zeilennummern unsichtbar machen (color{white} etc.)
2. Bei Platzhalter in Spalte aktuelle Zeilennummer auslesen und abspeichern.
3. Anhand von Gesamtzahl der der Zeilen ausrechnen, in welcher Spalte der Platzhalter steht (modulo usw., pgfmath / TikZ).

Aber: ich bekomme das für eine multicol-Umgebung gerade nicht hin.

Und: professioneller wäre vermutlich, wenn man den \columnbreak-Befehl der multicol-Umgebung kennt und entsprechend um eine Info manipuliert. Aber die 1. Methode könnte schon gehen.

(13 Mai, 11:57) cis

Für multicol habe ich mal etwas geschrieben, allerdings ging es dort um das Schreiben in das Inhaltsverzeichnis: https://tex.stackexchange.com/a/414638/117050

(20 Mai, 16:49) Skillmon

@Skillmon Und wie kann man das anwenden? Ich habe das so verstanden: Er hat einen Befehl \pos[1] und den schreibt er z.B. in Spalte 3. Und dann nimmt er einen Befehl \Spalte{\pos[1]}; und die Ausgabe davon ist pos 1 steht in Spalte 3. Kann natürlich sein, dass ich daneben liege. Falls nicht, finde ich das gar nicht so uninteressant.

(20 Mai, 18:09) cis

@cis ausgehend von meiner Lösung müsste man statt in die ToC-Datei in die .aux die momentane Spalte schreiben und die Definition der Labels so anpassen, dass die Spaltendefinition ausgewertet wird. Vielleicht kann ich später am Tag noch was ausprobieren.

(21 Mai, 04:02) Skillmon

Das Folgende ist eine schnelle Implementierung dessen, was ich bereits für Einträge in den ToC geschrieben hatte, für Labels. Die Implementierung hier unterstützt kein hyperref für \colref, allerdings sollten normale Referenzen hyperref unterstützen, wenn es geladen wird.

Es erstellt ein \collabel Macro, dass wie \label funktioniert, allerdings zusätzlich auch eine Referenz für Spalten ermöglicht, diese kann mit \colref verwendet werden. Der normale \label Befehl wird nicht beeinflusst. Das Ganze ist nicht ausgiebig getestet, wie zuverlässig die richtige Spalte gesetzt wird, weiß ich nicht.

Öffne in Overleaf
\documentclass{article}
\usepackage{lipsum} 
\usepackage[left=1cm,right=1cm,top=1cm,bottom=1cm]{geometry}
\usepackage{xcolor}

%% necessary packages
\usepackage[colaction]{multicol}
\usepackage{etoolbox}

\makeatletter
\AtBeginDocument
  {%
    \let\collabel@label\label
    \patchcmd\collabel@label{\@bsphack}{}{}{\harders@labelpatch@error}%
    \patchcmd\collabel@label{\@esphack}{}{}{\harders@labelpatch@error}%
  }
\newcommand\collabel[1]
  {%
    \@bsphack
    \collabel@label{#1}%
    \protected@write\@auxout{}{\string\harders@collabel{#1}}%
    \@esphack
  }
\newcommand\harders@collabel[1]
  {%
    \expandafter\harders@collabel@\expandafter{\harders@cur@col}{#1}%
  }
\newcommand\harders@collabel@[2]
  {%
    \global\@namedef{r@col@#2}{#1}%
  }
\newcommand\colref[1]
  {%
    \@ifundefined{r@col@#1}
      {\@latex@warning{Column reference `#1' on page \thepage\space undefined}}%
      {\csname r@col@#1\endcsname}%
  }
\newcounter{harders@col@count}
\def\harders@patch@last
  {%
    \stepcounter{harders@col@count}%
    \protected@write\@auxout{}%
      {%
        \def\protect\harders@cur@col{\arabic{harders@col@count}}%
      }%
  }
\def\harders@patch@else
  {%
    \ifmc@firstcol
      \setcounter{harders@col@count}{0}%
    \fi
    \harders@patch@last
  }
\def\harders@patch@error
  {%
    \GenericError{}
      {Patching of \string\mc@col@status@write\space failed}
      {%
        Make sure `colaction` was set as an option for `multicol`.%
        \MessageBreak
        Else you're screwed, don't use the code provided here.\MessageBreak%
      }
      {No further help available.}%
  }
\newcommand*\harders@labelpatch@error
  {%
    \GenericError{}{Patching of \string\label\space failed}
      {You shouldn't worry too much, that's not a big issue}
      {No further help available.}%
  }
\pretocmd\mc@lastcol@status@write{\harders@patch@last}{}{\harders@patch@error}
\pretocmd\mc@col@status@write{\harders@patch@else}{}{\harders@patch@error}
\makeatother

\begin{document}
\begin{multicols*}{5}
\lipsum[1]
\lipsum[4]
\textcolor{red}
  {here is the label (\refstepcounter{equation}\theequation\collabel{foo})}
\lipsum[3]
\lipsum[4-7]
\textcolor{red}{here is the reference (\ref{foo}) in column \colref{foo}}
\lipsum[8]
\lipsum[9]
\end{multicols*}
\end{document}

alt text

Permanenter link

beantwortet 21 Mai, 08:16

Skillmon's gravatar image

Skillmon
6664

Hallo Skillmon, dein Code funktioniert im Beispiel sehr gut. Ich werde ihn bei Gelegenheit auf meine Bedürfnisse (Detektion des Spaltenwechsels im Index) umstricken und dann hier Bescheid sagen, ob es dort auch funktioniert. Danke dir!

(21 Mai, 15:16) Harders
Deine Antwort auf die Frage (nicht auf andere Antworten)
Knebel-Vorschau

Folge dieser Frage

Per E-Mail:

Wenn Du Dich anmeldest, kannst Du Updates hier abonnieren

Per RSS:

Antworten

Antworten und Kommentare

Markdown-Grundlagen

  • *kursiv* oder _kursiv_
  • **Fett** oder __Fett__
  • Link:[Text](http://url.com/ "Titel")
  • Bild?![alt Text](/path/img.jpg "Titel")
  • nummerierte Liste: 1. Foo 2. Bar
  • zum Hinzufügen ein Zeilenumbruchs füge einfach zwei Leerzeichen an die Stelle ein, an der die neue Zeile sein soll.
  • grundlegende HTML-Tags werden ebenfalls unterstützt

Zugeordnete Themen:

×9
×3
×2
×1

Frage gestellt: 09 Mai, 08:07

Frage wurde angeschaut: 289 Mal

Zuletzt aktualisiert: 21 Mai, 15:16