Discussion:
Alignement et tableaux
(trop ancien pour répondre)
Jean-Marc Bourguet
2015-11-23 20:56:46 UTC
Permalink
Bonjour à tous,

J'aimerais bien que les lignes de base du texte extérieur à un tableau et
d'une des lignes (mais pas la première) du tableau soient alignées. Un
exemple valant mieux qu'un long discours:

\documentclass{article}
\begin{document}
foo
\tiny
\begin{tabular}{|p{1cm}|p{1cm}|}
\hline
&\\
\multicolumn{2}{|c|}{\normalsize\strut bar}\\
&\\
\hline
\multicolumn{2}{r}{\huge\strut 1}\\
\end{tabular}
\end{document}

foo et bar devrait être alignés. huge aide à mettre en évidence, en
pratique le tableau est généré par une macro assez complexe et les tailles
sont paramétrisables et la solution idéale devrait jouer uniquement sur la
définition de la macro (donc faire des ajustements à la main ne marche pas).

A+
--
Jean-Marc
Site de usenet-fr: http://www.usenet-fr.news.eu.org
Jean-Côme Charpentier
2015-11-23 22:48:23 UTC
Permalink
Post by Jean-Marc Bourguet
Bonjour à tous,
J'aimerais bien que les lignes de base du texte extérieur à un tableau et
d'une des lignes (mais pas la première) du tableau soient alignées. Un
\documentclass{article}
\begin{document}
foo
\tiny
\begin{tabular}{|p{1cm}|p{1cm}|}
\hline
&\\
\multicolumn{2}{|c|}{\normalsize\strut bar}\\
&\\
\hline
\multicolumn{2}{r}{\huge\strut 1}\\
\end{tabular}
\end{document}
foo et bar devrait être alignés. huge aide à mettre en évidence, en
pratique le tableau est généré par une macro assez complexe et les tailles
sont paramétrisables et la solution idéale devrait jouer uniquement sur la
définition de la macro (donc faire des ajustements à la main ne marche pas).
Si je comprends bien, le foo doit se positionner avant que TeX n'est
lu le contenu du tableau. Comme TeX est incapable de retour arrière dans
sa lecture d'un fichier source, il n'y a que trois solutions :
1. Faire un macro qui compose à la fois le « foo » et le tableau,
charge à elle de faire tous les allers-retours souhaités.
2. Utiliser le mécanisme de sauvegarde de la position du curseur
qu'offre pdftex et réaliser la chose en deux compilations.
3. Se servir d'un mécanisme de nœuds pour positionner à la fois le «
foo » et le « bar ». Perso, je connais plutôt PSTricks mais je suppose
que cela doit être faisable en TikZ (sinon je vais pouffer :-) )

En fait, j'ai du mal à imaginer ce qui est réellement demandé. Si
c'est une macro (paramétrable) qu'elle devrait être sa syntaxe ? En
attendant, voici l'idée générale avec les nœuds de PSTricks :

\documentclass{article}
\usepackage{pst-node}

\begin{document}
\leavevmode\hphantom{foo} % pour réserver la place
\pnode(0,0){Horizontal}
%%%\tiny % il servait à quoi ce tiny ?
\begin{tabular}[]{|p{1cm}|p{1cm}|}
\hline
&\\
\multicolumn{2}{|c|}{\normalsize\strut \rnode{Vertical}{bar}}\\
&\\
\hline
\multicolumn{2}{r}{\huge\strut 1}\\
\end{tabular}
\rput[r](Horizontal|Vertical){foo\space}
\end{document}

Jean-Côme Charpentier
--
Ouaaaah ! Le méga troll hyper pileux !
« C'est pas mon Windows, c'est LaTeX qui est bogué ». On ne l'avait
jamais tenté celui là. Ouuuuh. Mort de rire, mal aux abdominaux, pipi
culotte.
-+- Jean-Côme in fr.comp.text.tex -+-
Jean-Marc Bourguet
2015-11-24 06:07:27 UTC
Permalink
Post by Jean-Côme Charpentier
Post by Jean-Marc Bourguet
Bonjour à tous,
J'aimerais bien que les lignes de base du texte extérieur à un tableau et
d'une des lignes (mais pas la première) du tableau soient alignées. Un
\documentclass{article}
\begin{document}
foo
\tiny
\begin{tabular}{|p{1cm}|p{1cm}|}
\hline
&\\
\multicolumn{2}{|c|}{\normalsize\strut bar}\\
&\\
\hline
\multicolumn{2}{r}{\huge\strut 1}\\
\end{tabular}
\end{document}
foo et bar devrait être alignés. huge aide à mettre en évidence, en
pratique le tableau est généré par une macro assez complexe et les tailles
sont paramétrisables et la solution idéale devrait jouer uniquement sur la
définition de la macro (donc faire des ajustements à la main ne marche pas).
Si je comprends bien, le foo doit se positionner avant que TeX n'est
lu le contenu du tableau.
Non, c'est le tableau qui doit être placé verticalement correctement par
rapport au paragraphe dans lequel il est. Je peux complèter mon exemple,
mais il est un peu moins minimal:

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{array}
\begin{document}

alignement désiré:
{\tiny
\begin{tabular}[t]{|p{1cm}|p{1cm}|}
\multicolumn{2}{|c|}{\normalsize\strut bar}\\
& 36 \\
\hline
\multicolumn{2}{r}{\tiny\strut 1}\\
\end{tabular}}

mais avec la ligne principale d'un tableau comme ceci:
{\tiny
\begin{tabular}{|p{1cm}|p{1cm}|}
\hline
42 & \\
\multicolumn{2}{|c|}{\normalsize\strut bar}\\
& 36 \\
\hline
\multicolumn{2}{r}{\tiny\strut 1}\\
\end{tabular}}

t ne fonctionne plus dès qu'on commence avec hline:
{\tiny
\begin{tabular}[t]{|p{1cm}|p{1cm}|}
\hline
\multicolumn{2}{|c|}{\normalsize\strut bar}\\
&\\
\hline
\multicolumn{2}{r}{\tiny\strut 1}\\
\end{tabular}}

et même avec hfirstline, j'arrive pas à aligner sur la première ligne avec
de ma macro:
{\tiny
\begin{tabular}[t]{|p{1cm}|p{1cm}|}
\firsthline
\multicolumn{2}{|c|}{\normalsize\strut bar}\\
&\\
\hline
\multicolumn{2}{r}{\tiny\strut 1}\\
\end{tabular}}

car il faut faire simple:
\begin{tabular}[t]{|p{1cm}|p{1cm}|}
\firsthline
\multicolumn{2}{|c|}{\normalsize\strut bar}\\
&\\
\hline
\multicolumn{2}{r}{\tiny\strut 1}\\
\end{tabular}

\end{document}
Post by Jean-Côme Charpentier
Comme TeX est incapable de retour arrière dans
1. Faire un macro qui compose à la fois le « foo » et le tableau,
charge à elle de faire tous les allers-retours souhaités.
2. Utiliser le mécanisme de sauvegarde de la position du curseur
qu'offre pdftex et réaliser la chose en deux compilations.
3. Se servir d'un mécanisme de nœuds pour positionner à la fois le «
foo » et le « bar ». Perso, je connais plutôt PSTricks mais je suppose
que cela doit être faisable en TikZ (sinon je vais pouffer :-) )
En fait, j'ai du mal à imaginer ce qui est réellement demandé. Si
c'est une macro (paramétrable) qu'elle devrait être sa syntaxe ? En
\documentclass{article}
\usepackage{pst-node}
\begin{document}
\leavevmode\hphantom{foo} % pour réserver la place
\pnode(0,0){Horizontal}
%%%\tiny % il servait à quoi ce tiny ?
\begin{tabular}[]{|p{1cm}|p{1cm}|}
\hline
&\\
\multicolumn{2}{|c|}{\normalsize\strut \rnode{Vertical}{bar}}\\
&\\
\hline
\multicolumn{2}{r}{\huge\strut 1}\\
\end{tabular}
\rput[r](Horizontal|Vertical){foo\space}
\end{document}
Jean-Côme Charpentier
--
Jean-Marc
Site de usenet-fr: http://www.usenet-fr.news.eu.org
Jean-Marc Bourguet
2015-11-24 06:32:07 UTC
Permalink
Oops, parti trop vite.
Post by Jean-Côme Charpentier
Post by Jean-Marc Bourguet
Bonjour à tous,
J'aimerais bien que les lignes de base du texte extérieur à un tableau et
d'une des lignes (mais pas la première) du tableau soient alignées. Un
\documentclass{article}
\begin{document}
foo
\tiny
\begin{tabular}{|p{1cm}|p{1cm}|}
\hline
&\\
\multicolumn{2}{|c|}{\normalsize\strut bar}\\
&\\
\hline
\multicolumn{2}{r}{\huge\strut 1}\\
\end{tabular}
\end{document}
foo et bar devrait être alignés. huge aide à mettre en évidence, en
pratique le tableau est généré par une macro assez complexe et les tailles
sont paramétrisables et la solution idéale devrait jouer uniquement sur la
définition de la macro (donc faire des ajustements à la main ne marche pas).
Si je comprends bien, le foo doit se positionner avant que TeX n'est
lu le contenu du tableau.
Non, c'est le tableau qui doit être placé verticalement correctement par
rapport au paragraphe dans lequel il est. Je peux complèter mon exemple,
mais il est un peu moins minimal:

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{array}
\begin{document}

alignement désiré:
{\tiny
\begin{tabular}[t]{|p{1cm}|p{1cm}|}
\multicolumn{2}{|c|}{\normalsize\strut bar}\\
& 36 \\
\hline
\multicolumn{2}{r}{\tiny\strut 1}\\
\end{tabular}}

mais avec la ligne principale d'un tableau comme ceci:
{\tiny
\begin{tabular}{|p{1cm}|p{1cm}|}
\hline
42 & \\
\multicolumn{2}{|c|}{\normalsize\strut bar}\\
& 36 \\
\hline
\multicolumn{2}{r}{\tiny\strut 1}\\
\end{tabular}}

t ne fonctionne plus dès qu'on commence avec hline:
{\tiny
\begin{tabular}[t]{|p{1cm}|p{1cm}|}
\hline
\multicolumn{2}{|c|}{\normalsize\strut bar}\\
&\\
\hline
\multicolumn{2}{r}{\tiny\strut 1}\\
\end{tabular}}

et même avec hfirstline, j'arrive pas à aligner sur la première ligne avec
de ma macro:
{\tiny
\begin{tabular}[t]{|p{1cm}|p{1cm}|}
\firsthline
\multicolumn{2}{|c|}{\normalsize\strut bar}\\
&\\
\hline
\multicolumn{2}{r}{\tiny\strut 1}\\
\end{tabular}}

car il faut faire simple:
\begin{tabular}[t]{|p{1cm}|p{1cm}|}
\firsthline
\multicolumn{2}{|c|}{\normalsize\strut bar}\\
&\\
\hline
\multicolumn{2}{r}{\tiny\strut 1}\\
\end{tabular}

\end{document}
Post by Jean-Côme Charpentier
Comme TeX est incapable de retour arrière dans
1. Faire un macro qui compose à la fois le « foo » et le tableau,
charge à elle de faire tous les allers-retours souhaités.
C'est le tableau que je cherche à placer verticalement dans le paragraphe,
pas la ligne autour (perso, j'étendrais simplement le tableau avec une
cellule qui contient le préambule si c'était le cas).
Post by Jean-Côme Charpentier
2. Utiliser le mécanisme de sauvegarde de la position du curseur
qu'offre pdftex et réaliser la chose en deux compilations.
3. Se servir d'un mécanisme de nœuds pour positionner à la fois le «
foo » et le « bar ». Perso, je connais plutôt PSTricks mais je suppose
que cela doit être faisable en TikZ (sinon je vais pouffer :-) )
En fait, j'ai du mal à imaginer ce qui est réellement demandé.
Je crois que c'est le coeur du problème. J'ai déjà la macro qui me fais
des tableaux depuis environ 10 ans (cette macro pas très longue mais
utilisant expandafter et tokenlists est à la limite de mes capacités en
TeX). Je ne les utilisais qu'en mode display et ça va va très bien dans
les cas que j'utilise. Un copain s'est mis à vouloir l'utiliser dans un
paragraphe. En jouant avec les tailles, j'arrive à ne pas perturber de
manière inacceptable à mes yeux les interlignes, et ce qui reste de
choquant pour le moment est l'alignement vertical du tableau.

Ton approche est tellement différente de mes préconceptions sur la solution
(idéalement, usepackage{quivabien} et faire [l=2] plutôt que [t] ou alors
partir du tableau, le mettre en boite, calculer le déplacement nécessaire
-- et c'est là que je sèche --, déplacer la boite) qu'il faudra que je
réfléchisse plus pour voir si je peux en faire quelque chose.

Merci
--
Jean-Marc
Site de usenet-fr: http://www.usenet-fr.news.eu.org
Paul Gaborit
2015-11-24 08:24:09 UTC
Permalink
À (at) Mon, 23 Nov 2015 23:48:23 +0100,
Post by Jean-Côme Charpentier
3. Se servir d'un mécanisme de nœuds pour positionner à la fois le «
foo » et le « bar ». Perso, je connais plutôt PSTricks mais je suppose
que cela doit être faisable en TikZ (sinon je vais pouffer :-) )
Jean-Côme, ne pouffe pas ! ;-)

\documentclass{article}
\usepackage{tikz}
\begin{document}
foo
\begin{tikzpicture}[remember picture,baseline={(a.base)}]
\node{
\begin{tabular}{|p{1cm}|p{1cm}|}
\hline
&\\
\multicolumn{2}{|c|}{%
\normalsize\strut\tikz[remember picture]{\node (a){bar};}}\\
&\\
\hline
\multicolumn{2}{r}{\huge\strut 1}\\
\end{tabular}
};
\end{tikzpicture}
\end{document}

PS: ce document nécessite requiert deux compilations successives.
--
Paul Gaborit - <http://perso.mines-albi.fr/~gaborit/>
jfbu
2015-11-24 14:11:04 UTC
Permalink
2. Utiliser le mécanisme de sauvegarde de la position du curseur qu'offre pdftex et réaliser la chose en deux compilations.
Ce n'est pas évident car une fois l'alignement souhaité réalisé
il n'y a justement plus de "Delta" que l'on puisse repérer via
\pdfsavepos, \pdflastxpos, \pdflastypos.

J'ai ceci:

\documentclass{article}
\makeatletter
\def\SAUVEPOSITIONA{%
\pdfsavepos
\edef\***@temp{\gdef
\@backslashchar ***@vpositionA@\romannumeral\***@compte\space
{\noexpand\the\pdflastypos}}%
\write\@mainaux\expandafter{\***@temp}%
}%

\def\SAUVEPOSITIONB{%
\pdfsavepos
\edef\***@temp{\gdef
\@backslashchar ***@vpositionB@\romannumeral\***@compte\space
{\noexpand\the\pdflastypos}}%
\write\@mainaux\expandafter{\***@temp}%
\edef\***@temp{\xdef
\@backslashchar ***@deltaAB@\romannumeral\***@compte\space
{\noexpand\noexpand\noexpand\the\numexpr
\@backslashchar ***@vpositionA@\romannumeral\***@compte
-\@backslashchar ***@vpositionB@\romannumeral\***@compte
+\csname ***@deltaAB@\romannumeral\***@compte\endcsname}}%
\write\@mainaux\expandafter{\***@temp}%
}%

\newcommand*\VDELTAAB
{\csname ***@deltaAB@\romannumeral\***@compte\endcsname sp}%

\newcommand*\NOUVEAUXAETB
{%
\xdef\***@compte{\the\numexpr\***@compte+\@ne}%
\ifcsname ***@deltaAB@\romannumeral\***@compte\endcsname
\else
\global\@namedef{***@deltaAB@\romannumeral\***@compte}{0}%
\fi
}%

% initialisations
\def\***@compte {0}%
\def\***@deltaAB@ {0}%

\makeatother

\begin{document}

foo\SAUVEPOSITIONA{}
\tiny
\raisebox{\VDELTAAB}
{\begin{tabular}{|p{1cm}|p{1cm}|}
\hline
&\\
\multicolumn{2}{|c|}{\normalsize\strut\SAUVEPOSITIONB bar}\\
&\\
\hline
\multicolumn{2}{r}{\huge\strut 1}\\
\end{tabular}}

\NOUVEAUXAETB

foo\SAUVEPOSITIONA{}
\raisebox{\VDELTAAB}
{\begin{tabular}{|p{1cm}|p{1cm}|}
\hline
&\\
\multicolumn{2}{|c|}{\normalsize\strut\SAUVEPOSITIONB bar}\\
&\\
\hline
\multicolumn{2}{r}{\huge\strut 1}\\
\end{tabular}}
\par

\NOUVEAUXAETB

foo\SAUVEPOSITIONA{}
\raisebox{\VDELTAAB}
{\begin{tabular}{|p{1cm}|p{1cm}|}
\hline
&\\
\multicolumn{2}{|c|}{\huge\strut\SAUVEPOSITIONB bar}\\
&\\
\hline
\multicolumn{2}{r}{\normalsize\strut 1}\\
\end{tabular}}
\par

\end{document}

Mode d'emploi:
--------------

<Machin avec \SAUVEPOSITIONA>
\raisbox{\VDELTAAB}{Bidule avec \SAUVEPOSITIONB}

et surtout ne pas oublier le \NOUVEAUXAETB
après chaque utilisation.

Jean-François
jfbu
2015-11-24 14:33:41 UTC
Permalink
Post by jfbu
--------------
<Machin avec \SAUVEPOSITIONA>
\raisbox{\VDELTAAB}{Bidule avec \SAUVEPOSITIONB}
et surtout ne pas oublier le \NOUVEAUXAETB
après chaque utilisation.
pour permettre de positionner le B avant le A dans le fichier source,
il serait plus élégant de déplacer dans \NOUVEAUXAETB toute la
deuxième moitié du code de \SAUVEPOSITIONB (après le premier \write)

Et alors on pourrait renommer \NOUVEAUXAETB en \CALCULEDELTA
et insister encore plus que son emploi est obligatoire
(un \NOUVEAUXAETB actuel en dernier dans le document est optionnel)

cordialement
Jean-François
jfbu
2015-11-24 17:36:38 UTC
Permalink
Post by jfbu
--------------
<Machin avec \SAUVEPOSITIONA>
\raisbox{\VDELTAAB}{Bidule avec \SAUVEPOSITIONB}
et surtout ne pas oublier le \NOUVEAUXAETB
après chaque utilisation.
J'ai fait une variante pour l'emploi principal qui serait
de déplacer un repère quelconque pour le mettre
exactement sur la ligne de base
courante. Donc deux macros:

\SurLigne {Truc à bouger verticalement}

\Ancre: à utiliser une fois à l'endroit voulu au sein
du <Truc à bouger verticalement>.

\documentclass{article}

\usepackage{lipsum}

\makeatletter

% initialisations
\def\***@compte {0}%
\def\***@deltaAB@ {0}%

\def\SurLigne #1{%
\raisebox{\csname ***@deltaAB@\romannumeral\***@compte\endcsname sp}{#1}%
\pdfsavepos
\edef\***@temp{%
\gdef\@backslashchar ***@vpositionA@\romannumeral\***@compte\space
{\noexpand\the\pdflastypos}%
}%
\write\@mainaux\expandafter{\***@temp}%
\edef\***@temp{%
\xdef\@backslashchar ***@deltaAB@\romannumeral\***@compte\space
{\noexpand\noexpand\noexpand\the\numexpr
\@backslashchar ***@vpositionA@\romannumeral\***@compte
-\@backslashchar ***@vpositionB@\romannumeral\***@compte
+\csname ***@deltaAB@\romannumeral\***@compte\endcsname}%
}%
\write\@mainaux\expandafter{\***@temp}%
\xdef\***@compte{\the\numexpr\***@compte+\@ne}%
\ifcsname ***@deltaAB@\romannumeral\***@compte\endcsname
\else
\global\@namedef{***@deltaAB@\romannumeral\***@compte}{0}%
\fi
}%

\def\Ancre {%
\pdfsavepos
\edef\***@temp{\gdef
\@backslashchar ***@vpositionB@\romannumeral\***@compte\space
{\noexpand\the\pdflastypos}}%
\write\@mainaux\expandafter{\***@temp}%
}

\makeatother

\usepackage{amsmath}
\begin{document}

foo
\tiny
\SurLigne
{\begin{tabular}{|p{1cm}|p{1cm}|}
\hline
&\\
\multicolumn{2}{|c|}{\normalsize\strut\Ancre bar}\\
&\\
\hline
\multicolumn{2}{r}{\huge\strut 1}\\
\end{tabular}}

hello \SurLigne{$
\begin{pmatrix}
a&b&c&d\\
a&b&c&d\\
a&b&c&d\\
a&b&c&d\\
a&b&ICI\Ancre &d\\
a&b&c&d
\end{pmatrix}$} hello \SurLigne{$
\begin{pmatrix}
a&b&c&d\\
ICI\Ancre&b&c&d\\
a&b&c&d\\
a&b&c&d\\
a&b&c&d\\
a&b&c&d
\end{pmatrix}$} hello \SurLigne{$
\begin{pmatrix}
a&b&c&d\\
a&b&c&d\\
a&b&c&d\\
a&b&c&d\\
a&b&c&d\\
a&b&\Ancre ICI&d
\end{pmatrix}$} hello \SurLigne {\parbox{3cm}{\lipsum[1]
ICI \Ancre\lipsum [2]}}

\end{document}

Jean-François
Jean-Marc Bourguet
2015-11-24 19:07:47 UTC
Permalink
J'ai fait une variante pour l'emploi principal qui serait de déplacer un
repère quelconque pour le mettre exactement sur la ligne de base
\SurLigne {Truc à bouger verticalement}
\Ancre: à utiliser une fois à l'endroit voulu au sein
du <Truc à bouger verticalement>.
Merci. Cela semble me convenir parfaitement et est d'un usage général.

Je me demande seulement s'il n'y a pas moyen de résoudre mon problème d'une
manière qui ne nécessite pas deux passes (ou du moins dont les deux
passes). Il n'y a vraiment pas moyen de connaître la hauteur des lignes
d'un tableau? Il y en a pourtant besoin pour les filets. Il faudrait que
je replonge dans le chapitre 22...

A+
--
Jean-Marc
Site de usenet-fr: http://www.usenet-fr.news.eu.org
Jean-Marc Bourguet
2015-11-24 20:02:30 UTC
Permalink
Post by Jean-Marc Bourguet
J'ai fait une variante pour l'emploi principal qui serait de déplacer un
repère quelconque pour le mettre exactement sur la ligne de base
\SurLigne {Truc à bouger verticalement}
\Ancre: à utiliser une fois à l'endroit voulu au sein
du <Truc à bouger verticalement>.
Merci. Cela semble me convenir parfaitement et est d'un usage général.
Merci, ça fonctionne et j'ai pu l'intégrer dans mon environnement.
--
Jean-Marc
Site de usenet-fr: http://www.usenet-fr.news.eu.org
jfbu
2015-11-24 20:23:18 UTC
Permalink
Post by Jean-Marc Bourguet
Post by Jean-Marc Bourguet
J'ai fait une variante pour l'emploi principal qui serait de déplacer un
repère quelconque pour le mettre exactement sur la ligne de base
\SurLigne {Truc à bouger verticalement}
\Ancre: à utiliser une fois à l'endroit voulu au sein
du <Truc à bouger verticalement>.
Merci. Cela semble me convenir parfaitement et est d'un usage général.
Merci, ça fonctionne et j'ai pu l'intégrer dans mon environnement.
merci pour le retour, très heureux que ça fonctionne dans votre contexte,
je n'avais fait que des tests minimaux.

en cas de problème suite à des ajouts ou retraits, peut-être il faut
envisager de supprimer le fichier .aux pour relancer les compilations
sur un terrain vierge.

JF
Jean-Marc Bourguet
2015-11-24 21:18:20 UTC
Permalink
Post by jfbu
Post by Jean-Marc Bourguet
Post by Jean-Marc Bourguet
J'ai fait une variante pour l'emploi principal qui serait de déplacer un
repère quelconque pour le mettre exactement sur la ligne de base
\SurLigne {Truc à bouger verticalement}
\Ancre: à utiliser une fois à l'endroit voulu au sein
du <Truc à bouger verticalement>.
Merci. Cela semble me convenir parfaitement et est d'un usage général.
Merci, ça fonctionne et j'ai pu l'intégrer dans mon environnement.
merci pour le retour,
J'ai suffisemment aidé sur d'autres groupes pour savoir que c'est assez
frustrant de ne pas connaître la fin de l'histoire. On propose quelque
chose et on ne sait pas si ça a marché ou non.
Post by jfbu
très heureux que ça fonctionne dans votre contexte,
je n'avais fait que des tests minimaux.
en cas de problème suite à des ajouts ou retraits, peut-être il faut
envisager de supprimer le fichier .aux pour relancer les compilations
sur un terrain vierge.
J'ai effectivement eu des erreurs que j'ai pu réfler comme ça, mais
uniquement pendant que j'adaptais mon environnement (le fait que ce soit un
environnement m'a forcé à tout mettre dans une boite et utiliser \usebox
comme argument de SurLine; je ne suis d'ailleurs pas sûr d'avoir compris
pourquoi ça marche -- et ne serais pas surpris que ça ne marche que parce
que tous les décalages sont en fait les mêmes)

A+
--
Jean-Marc
Site de usenet-fr: http://www.usenet-fr.news.eu.org
jfbu
2015-11-24 21:47:03 UTC
Permalink
Post by Jean-Marc Bourguet
Post by jfbu
Post by Jean-Marc Bourguet
Post by Jean-Marc Bourguet
J'ai fait une variante pour l'emploi principal qui serait de déplacer un
repère quelconque pour le mettre exactement sur la ligne de base
\SurLigne {Truc à bouger verticalement}
\Ancre: à utiliser une fois à l'endroit voulu au sein
du <Truc à bouger verticalement>.
Merci. Cela semble me convenir parfaitement et est d'un usage général.
Merci, ça fonctionne et j'ai pu l'intégrer dans mon environnement.
merci pour le retour,
J'ai suffisemment aidé sur d'autres groupes pour savoir que c'est assez
frustrant de ne pas connaître la fin de l'histoire. On propose quelque
chose et on ne sait pas si ça a marché ou non.
Post by jfbu
très heureux que ça fonctionne dans votre contexte,
je n'avais fait que des tests minimaux.
en cas de problème suite à des ajouts ou retraits, peut-être il faut
envisager de supprimer le fichier .aux pour relancer les compilations
sur un terrain vierge.
J'ai effectivement eu des erreurs que j'ai pu réfler comme ça, mais
uniquement pendant que j'adaptais mon environnement (le fait que ce soit un
environnement m'a forcé à tout mettre dans une boite et utiliser \usebox
comme argument de SurLine; je ne suis d'ailleurs pas sûr d'avoir compris
pourquoi ça marche -- et ne serais pas surpris que ça ne marche que parce
que tous les décalages sont en fait les mêmes)
Vous voulez dire que vous avez utilisé quelque chose dans ce genre,
pour « wrapper » votre environnement initial ?

\newsavebox\***@box
\newenvironment {SurLaLigne}
{\begin{lrbox}{\***@box}}
{\end{lrbox}\SurLigne{\usebox{\***@box}}}

Voici à nouveau le code, et dans les exemples les décalages ne sont pas
tousles mêmes:


\documentclass{article}

\usepackage{lipsum}
\usepackage{amsmath}

\makeatletter

% initialisations
\def\***@compte {0}%
\def\***@deltaAB@ {0}%

% Les macros \SurLigne et \Ancre
\def\SurLigne #1{%
\raisebox{\csname ***@deltaAB@\romannumeral\***@compte\endcsname sp}{#1}%
\pdfsavepos
\edef\***@temp{%
\gdef\@backslashchar ***@vpositionA@\romannumeral\***@compte\space
{\noexpand\the\pdflastypos}%
}%
\write\@mainaux\expandafter{\***@temp}%
\edef\***@temp{%
\xdef\@backslashchar ***@deltaAB@\romannumeral\***@compte\space
{\noexpand\noexpand\noexpand\the\numexpr
\@backslashchar ***@vpositionA@\romannumeral\***@compte
-\@backslashchar ***@vpositionB@\romannumeral\***@compte
+\csname ***@deltaAB@\romannumeral\***@compte\endcsname}%
}%
\write\@mainaux\expandafter{\***@temp}%
\xdef\***@compte{\the\numexpr\***@compte+\@ne}%
\ifcsname ***@deltaAB@\romannumeral\***@compte\endcsname
\else
\global\@namedef{***@deltaAB@\romannumeral\***@compte}{0}%
\fi
}%

\def\Ancre {%
\pdfsavepos
\edef\***@temp{\gdef
\@backslashchar ***@vpositionB@\romannumeral\***@compte\space
{\noexpand\the\pdflastypos}}%
\write\@mainaux\expandafter{\***@temp}%
}


% La forme Environnement de \SurLigne.

\newsavebox\***@box
\newenvironment {SurLaLigne}
{\begin{lrbox}{\***@box}}
{\end{lrbox}\SurLigne{\usebox{\***@box}}}

\makeatother

% Les Exemples
\begin{document}

foo
\tiny
\begin{SurLaLigne}
\begin{tabular}{|p{1cm}|p{1cm}|}
\hline
&\\
\multicolumn{2}{|c|}{\normalsize\strut\Ancre bar}\\
&\\
\hline
\multicolumn{2}{r}{\huge\strut 1}\\
\end{tabular}
\end{SurLaLigne}

hello
\begin{SurLaLigne}
$\begin{tabular}{|c|c|c|c|}
a&b&c&d\\
a&$B^{B^B}$&c&\Ancre ICI\\
a&$B^{B^B}$&c&d\\
a&b&c&d\rule{.4pt}{1cm}\\
a&b&c &d\\
a&b&c&d
\end{tabular}$
\end{SurLaLigne}
hello
\begin{SurLaLigne}
$\begin{pmatrix}
a&b&c&d\\
ICI\Ancre&b&c&d\\
a&b&c&d\\
a&b&c&d\\
a&b&c&d\\
a&b&c&d
\end{pmatrix}$
\end{SurLaLigne}
hello
\begin{SurLaLigne}
$\begin{pmatrix}
a&b&c&d\\
a&b&c&d\\
a&b&c&d\\
a&b&c&d\\
a&b&c&d\\
a&b&\Ancre ICI&d
\end{pmatrix}$
\end{SurLaLigne}
hello
\begin{SurLaLigne}
\parbox{3cm}{\lipsum[1]ICI \Ancre\lipsum [2]}
\end{SurLaLigne}
\end{document}
Jean-Marc Bourguet
2015-11-25 08:27:26 UTC
Permalink
Post by jfbu
\newenvironment {SurLaLigne}
C'est bien cela en substance (je l'ai en fait directement intégré à l'environnement que j'avais). J'ai été surpris de ne pas voir le genre de problème de décalage dans le document qui en avait. Je suis maintenant persuadé que ça ne fonctionnait que parce que les décalages nécessaires sont souvent les mêmes et que les cas où il y aurait dû avoir un problème ont été masqués par les utilisations hors paragraphes.

A+
--
Jean-Marc
jfbu
2015-11-24 20:19:48 UTC
Permalink
Post by Jean-Marc Bourguet
J'ai fait une variante pour l'emploi principal qui serait de déplacer un
repère quelconque pour le mettre exactement sur la ligne de base
\SurLigne {Truc à bouger verticalement}
\Ancre: à utiliser une fois à l'endroit voulu au sein
du <Truc à bouger verticalement>.
Merci. Cela semble me convenir parfaitement et est d'un usage général.
Je me demande seulement s'il n'y a pas moyen de résoudre mon problème d'une
manière qui ne nécessite pas deux passes (ou du moins dont les deux
passes). Il n'y a vraiment pas moyen de connaître la hauteur des lignes
d'un tableau? Il y en a pourtant besoin pour les filets. Il faudrait que
je replonge dans le chapitre 22...
A+
de source2e:

\arraystretch
: line spacing in array and tabular environments is done by
placing a strut in every row of height and depth
\arraystretch times the height and depth of the strut
produced by an ordinary \strut command

on doit donc (à partir de \ht\strutbox et \dp\strutbox et
de \arraystretch)
pouvoir pondre une fonction affine n-> an+b pour
obtenir la position verticale de la ligne de base de la n ième
ligne du tableau, mais il faut l'ajuster si on change de taille
de police, cela dépend de la présence ou non de \hline,
et tout se casse la figure si les cellules contiennent des choses
plus hautes ou plus profondes que la \strutbox...

à propos des filets, je suppose que vous faites référence
aux filets verticaux, tout repose en dernière analyse sur la
primitive \vrule qui par défaut va prendre la hauteur qu'elle
qu'elle soit de la boîte dans laquelle elle est. Il n'y a donc
pas besoin au niveau de LaTeX de connaître explicitement
cette hauteur, c'est géré par TeX dans ses manipulations de boîtes
et de colles.

Jean-François
jfbu
2015-11-24 20:25:54 UTC
Permalink
Post by Jean-Côme Charpentier
qu'elle
qu'elle soit
aïe

à part ceci, le nom \SurLigne de la macro n'est
pas très bien choisi, je me suis aperçu après
de la confusion possible avec le verbe surligner.

Jean-François
Continuer la lecture sur narkive:
Loading...