Problème de centrage et de taille dans tabularx

9 views
Skip to first unread message

cyrille

unread,
Apr 5, 2021, 7:17:34 AMApr 5
to
Bonjour.

J'essaye de faire tenir dans une petite cellule un peu de texte en utilisant resizebox.
Le problème est que le contenu des cellules n'est pas centré (malgré \newcolumntype{Y}{>{\centering}X}) et bien sur le mot litre n'a pas la même taille que les autres (normal il est plus petit et le resizebox le rend donc plus grand).
Dans le deuxième tableau j'ai essayé avec un hphantom. Le mot litre a la bonne taille mais du coup il est compètement excentré.

J'ai l'ECM suivant pour vous faire une idée :

\documentclass[a4paper,12pt]{article}
\usepackage[paper=a4paper,centering,hmargin=0.7cm]{geometry}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{graphicx}
\usepackage{tabularx}

\begin{document}
\newcolumntype{Y}{>{\centering}X}
\setlength{\parindent}{0pt}

\begin{tabularx}{\textwidth}{|Y|Y|Y|Y|Y|Y|Y|Y|Y|Y|Y|Y|Y|Y|Y|Y|Y|Y|Y|Y|Y|}
\hline
& & & & & & & & & & & & \resizebox{0.75cm}{!}{hectolitre} & \resizebox{0.75cm}{!}{décalitre} & \resizebox{0.75cm}{!}{litre} & \resizebox{0.75cm}{!}{décilitre} & \resizebox{0.75cm}{!}{centilitre} & \resizebox{0.75cm}{!}{millilitre} & & &\tabularnewline
\hline
\end{tabularx}

\begin{tabularx}{\textwidth}{|Y|Y|Y|Y|Y|Y|Y|Y|Y|Y|Y|Y|Y|Y|Y|Y|Y|Y|Y|Y|Y|}
\hline
& & & & & & & & & & & & \resizebox{0.75cm}{!}{ hectolitre} & \resizebox{0.75cm}{!}{ décalitre} & \resizebox{0.75cm}{!}{ \hphantom{déca}litre} & \resizebox{0.75cm}{!}{ décilitre} & \resizebox{0.75cm}{!}{ centilitre} & \resizebox{0.75cm}{!}{ millilitre} & & &\tabularnewline
\hline
\end{tabularx}
\end{document}

Comment faire pour que le contenu des cellules tienne juste dedans, qu'il soit centré et qu'ils aient tous la même taille ?
Des idées ?
Merci d'avance
Cyrille DEUSS

Alain Ketterlin

unread,
Apr 5, 2021, 9:21:53 AMApr 5
to
cyrille <cyrill...@gmail.com> writes:

> Le problème est que le contenu des cellules n'est pas centré (malgré
> \newcolumntype{Y}{>{\centering}X}) et bien sur le mot litre n'a pas la
> même taille que les autres (normal il est plus petit et le resizebox
> le rend donc plus grand).
> Dans le deuxième tableau j'ai essayé avec un hphantom. Le mot litre a
> la bonne taille mais du coup il est compètement excentré.
>
> J'ai l'ECM suivant pour vous faire une idée :
[...]
> \begin{tabularx}{\textwidth}{|Y|Y|Y|Y|Y|Y|Y|Y|Y|Y|Y|Y|Y|Y|Y|Y|Y|Y|Y|Y|Y|}
> \hline
> & & & & & & & & & & & & \resizebox{0.75cm}{!}{hectolitre} & \resizebox{0.75cm}{!}{décalitre} & \resizebox{0.75cm}{!}{litre} & \resizebox{0.75cm}{!}{décilitre} & \resizebox{0.75cm}{!}{centilitre} & \resizebox{0.75cm}{!}{millilitre} & & &\tabularnewline
> \hline
> \end{tabularx}

Le problème est que 0.75cm est plus grand que la taille alloué à chaque
colonne Y ; le fichier .log doit l'indiquer. Essaie avec une taille
inférieure, et tu verras que tout est correctement centré (sauf dans ta
deuxième solution, où la taille de "déca" reste prise en compte).

-- Alain.

cyrille

unread,
Apr 5, 2021, 1:36:15 PMApr 5
to
Merci de m'avoir guidé vers la solution.
Finalement grâce à un \setlength\tabcolsep{1pt} %default 6pt, je peux finalement mettre un \resizebox{0.85cm} sans avoir d'Overfull \hbox et cela tient juste dans la cellule comme désiré.
Par contre pour la case "litre", un resizebox me donne une taille de fonte plus grande. Un \tiny résout le problème même si il y a visuellement une légère différence avec les cellules adjacentes.



Vincent Belaïche

unread,
Apr 5, 2021, 5:21:47 PMApr 5
to
Essayez de remplacer 0.75cm par \hsize.

Sinon comme vous avez 21 colonnes, la largeur de chaque colonne est

\dimexp0.047619047619\textwidth-2\tabcolsep-1.04761904762\arrayrulewidth



* 0.047619047619 = 1/21
* 1.04761904762 = 22/21

Vous pouvez donc aussi remplacer 0.75cm par \largeurcolxxi en ayant fait
qq part

\newlength\largeurcolxxi
\setlength\largeurcolxxi{\dimexp0.047619047619\textwidth-2\tabcolsep-1.04761904762\arrayrulewidth}



--

Alain Ketterlin

unread,
Apr 6, 2021, 4:57:11 AMApr 6
to
Vincent Belaïche <vincent....@gmail.com> writes:

>> cyrille <cyrill...@gmail.com> writes:

>> [...]
>>> \begin{tabularx}{\textwidth}{|Y|Y|Y|Y|Y|Y|Y|Y|Y|Y|Y|Y|Y|Y|Y|Y|Y|Y|Y|Y|Y|}
>>> \hline
>>> & & & & & & & & & & & & \resizebox{0.75cm}{!}{hectolitre} &
>>> \resizebox{0.75cm}{!}{décalitre} & \resizebox{0.75cm}{!}{litre} &
>>> \resizebox{0.75cm}{!}{décilitre} & \resizebox{0.75cm}{!}{centilitre}
>>> & \resizebox{0.75cm}{!}{millilitre} & & &\tabularnewline
>>> \hline
>>> \end{tabularx}

> Essayez de remplacer 0.75cm par \hsize.
>
> Sinon comme vous avez 21 colonnes, la largeur de chaque colonne est
>
> \dimexp0.047619047619\textwidth-2\tabcolsep-1.04761904762\arrayrulewidth
>
> où
>
> * 0.047619047619 = 1/21
> * 1.04761904762 = 22/21
>
> Vous pouvez donc aussi remplacer 0.75cm par \largeurcolxxi en ayant fait
> qq part
>
> \newlength\largeurcolxxi
> \setlength\largeurcolxxi{\dimexp0.047619047619\textwidth-2\tabcolsep-1.04761904762\arrayrulewidth}

Je ne suis pas sûr que \hsize soit correctement initialisé dans les
cellules... Mais il est possible de l'utiliser dans l'entête du tableau,
et de laisser tabularx faire le calcul. Avec ta longueur :

\begin{tabularx}{\textwidth}{{|>{\global\largeurcolxxi\hsize}Y|Y|...}

-- Alain.

Alain Ketterlin

unread,
Apr 6, 2021, 5:02:58 AMApr 6
to
cyrille <cyrill...@gmail.com> writes:

>> [...]
>> > \begin{tabularx}{\textwidth}{|Y|Y|Y|Y|Y|Y|Y|Y|Y|Y|Y|Y|Y|Y|Y|Y|Y|Y|Y|Y|Y|}
>> > \hline
>> > & & & & & & & & & & & & \resizebox{0.75cm}{!}{hectolitre} &
>> > \resizebox{0.75cm}{!}{décalitre} & \resizebox{0.75cm}{!}{litre} &
>> > \resizebox{0.75cm}{!}{décilitre} &
>> > \resizebox{0.75cm}{!}{centilitre} &
>> > \resizebox{0.75cm}{!}{millilitre} & & &\tabularnewline
>> > \hline
>> > \end{tabularx}

> Merci de m'avoir guidé vers la solution.
> Finalement grâce à un \setlength\tabcolsep{1pt} %default 6pt, je peux
> finalement mettre un \resizebox{0.85cm} sans avoir d'Overfull \hbox et
> cela tient juste dans la cellule comme désiré.
> Par contre pour la case "litre", un resizebox me donne une taille de
> fonte plus grande. Un \tiny résout le problème même si il y a
> visuellement une légère différence avec les cellules adjacentes.

Honnêtement, cela me semble une idée terrible d'utiliser \resizebox,
parce que chaque fonte aura une taille différente... À ta place, je
déterminerai (en tâtonnant) la taille à utiliser et je l'utiliserai
globalement.

(Tes cellules sont des paragraphes, donc tu peux aussi écrire ces mots
sur deux lignes avec une taille à peu près normale. Bref, je dis cela
sans savoir ce que tu veux faire exactement.)

-- Alain.

cyrille

unread,
Apr 6, 2021, 5:41:57 AMApr 6
to
Voila le résultat final. On peut remarquer certaines horreurs :
- \phantom{$\displaystyle\frac{\frac{1}{2}}{\frac{1}{2}}$} pour avoir une cellule plus haute avec un texte centré verticalement ;
- le \resizebox qui est transformé en \tiny pour les litres, d'où une très légère différence avec les colonnes adjacentes. De plus les textes des cellules hectolitre, décalitre, etc ne doivent pas être à la même taille car le le facteur de réduction de resizebox dépend de la longueur du mot considéré mais bon là on coupe les cheveux en quatre. La différence n'est pas visible à l'oeil nu.
Il doit y en avoir d'autres.
Si vous avez des propositions pour améliorer le code je suis preneur.


\documentclass[a4paper,12pt]{article}
\usepackage[paper=a4paper,centering,hmargin=0.7cm,vmargin=1cm,noheadfoot]{geometry}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[french]{babel}
\usepackage{siunitx}
\usepackage{calc}
\usepackage{graphicx}

\usepackage{tabularx}
\usepackage{colortbl}
\usepackage{arydshln}
\setlength{\arrayrulewidth}{0.8pt} %default 0.4pt
\setlength\tabcolsep{1pt} %default 6pt

\usepackage{xcolor}
\DeclareSIUnit\centiare{ca}
\DeclareSIUnit\are{a}
\sisetup{detect-all=true, detect-family=true,output-decimal-marker = {,}}

\begin{document}
\pagestyle{empty}
\renewcommand{\arraystretch}{1.2}
\newcolumntype{Y}{>{\centering}X}
\setlength{\parindent}{0pt}

\newcommand{\mc}[1]{\multicolumn{1}{c;{2pt/1pt}}{#1}}
\newcommand{\mcbis}[1]{\multicolumn{1}{|c;{2pt/1pt}}{#1}}
\newcommand{\mcter}[1]{\multicolumn{1}{c|}{#1}}

\definecolor{couleura}{HTML}{bf8f00}
\definecolor{couleurb}{HTML}{fff2cc}
\definecolor{mygreen}{HTML}{00b050}
\arrayrulecolor{couleura}

\begin{tabularx}{\textwidth}{|Y|Y|Y|Y|Y|Y|Y|Y|Y|Y|Y|Y|Y|Y|Y|Y|Y|Y|Y|Y|Y|}
\rowcolor{couleura}
\multicolumn{21}{|c|}{{\phantom{$\displaystyle\frac{\frac{1}{2}}{\frac{1}{2}}$}}\color{white}\bf Volume}
\tabularnewline
\hline
\rowcolor{couleurb}
\multicolumn{3}{|c|}{\bfseries$\si{\kilo\metre\cubed}$} &
\multicolumn{3}{c|}{\bfseries$\si{\hecto\metre\cubed}$} &
\multicolumn{3}{c|}{\bfseries$\si{\deca\metre\cubed}$} &
\multicolumn{3}{c|}{\bfseries$\si{\metre\cubed}$} &
\multicolumn{3}{c|}{\bfseries$\si{\deci\metre\cubed}$} &
\multicolumn{3}{c|}{\bfseries$\si{\centi\metre\cubed}$} &
\multicolumn{3}{c|}{\bfseries$\si{\milli\metre\cubed}$}
\tabularnewline[-0.1cm]
\rowcolor{couleurb}
\multicolumn{3}{|c|}{\footnotesize kilomètre} & \multicolumn{3}{c|}{\footnotesize hectomètre} &
\multicolumn{3}{c|}{\footnotesize décamètre} &
\multicolumn{3}{c|}{\footnotesize mètre} &
\multicolumn{3}{c|}{\footnotesize décimètre} &
\multicolumn{3}{c|}{\footnotesize centimètre} &
\multicolumn{3}{c|}{\footnotesize millimètre}
\tabularnewline[-0.1cm]
\rowcolor{couleurb}
\multicolumn{3}{|c|}{\footnotesize cube} & \multicolumn{3}{c|}{\footnotesize cube} &
\multicolumn{3}{c|}{\footnotesize cube} &
\multicolumn{3}{c|}{\footnotesize cube} &
\multicolumn{3}{c|}{\footnotesize cube} &
\multicolumn{3}{c|}{\footnotesize cube} &
\multicolumn{3}{c|}{\footnotesize cube}
\tabularnewline
\hline
\rowcolor{couleurb}
& & & & & & & & & & & & \bfseries$\si{\hecto\liter}$ & \bfseries$\si{\deca\liter}$ & \bfseries$\si{\liter}$ & \bfseries$\si{\deci\liter}$ & \bfseries$\si{\centi\liter}$ & \bfseries$\si{\milli\liter}$ & & &\tabularnewline[-0.1cm]
\rowcolor{couleurb}
& & & & & & & & & & & & \resizebox{\hsize}{!}{hectolitre} & \resizebox{\hsize}{!}{décalitre} & \tiny litre & \resizebox{\hsize}{!}{décilitre} & \resizebox{\hsize}{!}{centilitre} & \resizebox{\hsize}{!}{millilitre} & & &\tabularnewline
\hline
\mcbis{} & \mc{} & & \mc{} & \mc{} & & \mc{} & \mc{} & & \mc{} & \mc{} & & \mc{} & \mc{} & \cellcolor{couleurb}$1$ & \mc{} & \mc{} & & \mc{} & \mc{} &\tabularnewline
\hline
\hline
\mcbis{} & \mc{} & & \mc{} & \mc{} & & \mc{} & \mc{} & & \mc{} & \mc{} & \cellcolor{couleurb}$1$ & \mc{} & \mc{} & & \mc{} & \mc{} & & \mc{} & \mc{} &\tabularnewline
\hline
\mcbis{} & \mc{} & & \mc{} & \mc{} & & \mc{} & \mc{} & & \mc{} & \mc{} & \cellcolor{couleurb}$1$ & \mc{\color{mygreen}$0$} & \mc{\color{mygreen}$0$} & \mcter{\color{mygreen}$0$} & \mc{} & \mc{} & & \mc{} & \mc{} &\tabularnewline
\hline
\hline
\mcbis{} & \mc{} & & \mc{} & \mc{} & & \mc{} & \mc{} & & \mc{} & \mc{} & & \mc{} & \mc{} & \cellcolor{couleurb}$1$ & \mc{} & \mc{} & & \mc{} & \mc{} &\tabularnewline
\hline
\mcbis{} & \mc{} & & \mc{} & \mc{} & & \mc{} & \mc{} & & \mc{} & \mc{} & \mcter{\color{mygreen}$0$} & \mc{\color{mygreen}$0$} & \mc{\color{mygreen}$0$} & \cellcolor{couleurb}$1$ & \mc{} & \mc{} & & \mc{} & \mc{} &\tabularnewline
\hline
\hline
\mcbis{} & \mc{} & & \mc{} & \mc{} & & \mc{} & \mc{} & & \mc{} & \mc{} & & \mc{} & \mc{\cellcolor{couleurb}$1$} & \cellcolor{couleurb}$2$ & \mc{\cellcolor{couleurb}$3$} & \mc{\cellcolor{couleurb}$6$} & & \mc{} & \mc{} &\tabularnewline
\hline
\mcbis{} & \mc{} & & \mc{} & \mc{} & & \mc{} & \mc{} & & \mc{} & \mc{} & \mcter{\color{mygreen}$0$} & \mc{\color{mygreen}$0$} & \mc{\cellcolor{couleurb}$1$} & \cellcolor{couleurb}$2$ & \mc{\cellcolor{couleurb}$3$} & \mc{\cellcolor{couleurb}$6$} & & \mc{} & \mc{} &\tabularnewline
\hline
\mcbis{} & \mc{} & & \mc{} & \mc{} & & \mc{} & \mc{} & & \mc{} & \mc{} & & \mc{} & \mc{\cellcolor{couleurb}$1$} & \cellcolor{couleurb}$2$ & \mc{\cellcolor{couleurb}$3$} & \mc{\cellcolor{couleurb}$6$} & \mcter{\color{mygreen}$0$} & \mc{} & \mc{} &\tabularnewline
\hline
\end{tabularx}

\end{document}
Reply all
Reply to author
Forward
0 new messages