Allinea più tabelle tabularx

Nov 04 2020

cercando di costruire il mio CV qui con Latex. Ho trovato un modello,https://github.com/btskinner/tex_cv/blob/master/cv.tex. Quello che non capisco è perché nell'esempio qui sotto le due tabelle non sono allineate, anche se a quanto vedo il codice dovrebbe allinearle? Ecco come si compila per me:

Come faccio a ottenere l'allineamento di 2020 e XXXX, "Something, somwhere" e test? Grazie!

\documentclass[11pt]{article}
\newcommand{\recentyear}{1900}  % artificially low year to include everything

% ------------------------------------------------------------------------------
% HEADER STUFF (CAN LEAVE ALONE UNLESS YOU WANT TO PERSONALIZE)
% ------------------------------------------------------------------------------

% -------------------------------
% Packages
% -------------------------------

\usepackage[margin=1in]{geometry} % for margins
\usepackage[american]{babel}      % for language

      % for reference sections


\usepackage{titlesec}             % to adjust section headers
\usepackage{tabularx}             % for fluid tables

% -------------------------------
% Macros


\newcommand{\RR}{\raggedright\arraybackslash} % left justified
\newcommand{\RL}{\raggedleft\arraybackslash}  % right justified

% for tables to keep consistent alignment across sections
\newcolumntype{\twocols}{>{\RR}p{1.25in}>{\RR}X}
\newcolumntype{\threecols}{>{\RR}p{1.25in}>{\RR}X>{\RL}p{1in}}

\begin{document}

\section*{Education}
\begin{center}
    \vspace{-1.5em}
    \rule{\textwidth}{0.5pt}  
\end{center}

\begin{tabularx}{\linewidth}{\threecols}
 2020 (expected) &Something, somewhere & Ph.D. \\ % or YYYY (expected)
 
\end{tabularx}


\section*{Grants and Scholarships}
\begin{center}
    \vspace{-1.5em}
    \rule{\textwidth}{0.5pt}  
\end{center}
\begin{tabularx}{\linewidth}{\threecols}
    YYYY & test & bb \\
    YYYY - YYYY & Fellowship & \$ AMOUNT \\ % if normal in your field
    
\end{tabularx}  
\end{document}

Risposte

3 egreg Nov 04 2020 at 01:43

Userei le macro e no tabularx:

\documentclass[11pt]{article}
\usepackage{array}
% -------------------------------
% Packages
% -------------------------------

\usepackage[margin=1in]{geometry} % for margins
\usepackage[american]{babel}      % for language

      % for reference sections


\usepackage{titlesec}             % to adjust section headers
\usepackage{tabularx}             % for fluid tables

\newcommand{\recentyear}{1900}  % artificially low year to include everything

\titleformat{\section}
 {\bfseries\Large}
 {}% no number
 {0pt}% no space
 {}% the title
 [\titlerule]

% ------------------------------------------------------------------------------
% HEADER STUFF (CAN LEAVE ALONE UNLESS YOU WANT TO PERSONALIZE)
% ------------------------------------------------------------------------------


% -------------------------------
% Macros

\newcommand{\twocolsection}[2]{%
  \section{#1}
  \begin{tabular}[t]{
    @{}
    wl{1.25in}
    >{\raggedright\arraybackslash}p{\dimexpr\textwidth-1.25in-2\tabcolsep}
    @{}
  }
  #2
  \end{tabular}\par
}
\newcommand{\threecolsection}[2]{%
  \section{#1}
  \begin{tabular}[t]{
    @{}
    wl{1.25in}
    >{\raggedright\arraybackslash}p{\dimexpr\textwidth-2.25in-4\tabcolsep}
    wr{1in}
    @{}
  }
  #2
  \end{tabular}\par
}

\begin{document}

\threecolsection{Education}{
 2020 (expected) &Something, somewhere & Ph.D. \\ % or YYYY (expected)
}

\threecolsection{Grants and Scholarships}{
    YYYY & test & bb \\
    YYYY - YYYY & Fellowship & \$ AMOUNT \\ % if normal in your field
}

\end{document}

Potresti parametrizzare la larghezza della prima e dell'ultima colonna, nel caso in cui i dati per il CV specifico non si adattino.

In questo modo non rischi che tabularsi stacchi dal titolo.


Una versione più raffinata in cui le larghezze delle colonne (prima e terza) sono parametrizzate, in modo da poter modificare le loro dimensioni nel punto appropriato del preambolo. Inoltre \twocolsectione \threecolsectionhanno un argomento opzionale che dovrebbe essere L(predefinito) o J, per specificare l'allineamento a sinistra (irregolare a destra) o la giustificazione nella colonna principale.

\documentclass[11pt]{article}

\usepackage[margin=1in]{geometry} % for margins
\usepackage[american]{babel}      % for language
\usepackage{titlesec}             % to adjust section headers
\usepackage{array}

% customization of sections

\titleformat{\section}
 {\bfseries\Large}
 {}% no number
 {0pt}% no space
 {}% the title
 [\titlerule]

% main macros

\newlength{\firstcol}
\newlength{\thirdcol}

% helper column types
\newcolumntype{L}[2]{%
  >{\raggedright\arraybackslash}p{\dimexpr\textwidth-(#1)-#2\tabcolsep\relax}%
}
\newcolumntype{J}[2]{%
  p{\dimexpr\textwidth-(#1)-#2\tabcolsep\relax}%
}

\newcommand{\twocolsection}[3][L]{%
  \section{#2}
  \begin{tabular}[t]{
    @{}
    wl{\firstcol}
    #1{\firstcol}{2}
    @{}
  }
  #3
  \end{tabular}\par
}
\newcommand{\threecolsection}[3][L]{%
  \section{#2}
  \begin{tabular}[t]{
    @{}
    wl{\firstcol}
    #1{\firstcol+\thirdcol}{4}
    wr{\thirdcol}
    @{}
  }
  #3
  \end{tabular}\par
}

%%% final customization
\setlength{\firstcol}{1.25in}
\setlength{\thirdcol}{1in}
%%%

\begin{document}

\threecolsection{Education}{
  2020 (expected) &Something, somewhere & Ph.D. \\ % or YYYY (expected)
}

\threecolsection{Grants and Scholarships}{
  YYYY & test & bb \\
  YYYY - YYYY & Fellowship & \$ AMOUNT \\ % if normal in your field
}

\twocolsection{Whatever}{
  YYYY & something long to need being split across lines; let's just
         write long enough nonsense and see
}

\twocolsection[J]{Whatever}{
  YYYY & something long to need being split across lines; let's just
         write long enough nonsense and see
}

\end{document}


Un'altra versione in cui è possibile separare gli elementi in ogni elenco con uno spazio verticale. Sono necessari metodi di livello superiore per garantire che lo spazio venga aggiunto solo tra gli elementi, utilizzando \addlinespacefornito da booktabs.

\documentclass[11pt]{article}

\usepackage[margin=1in]{geometry} % for margins
\usepackage[american]{babel}      % for language
\usepackage{titlesec}             % to adjust section headers
\usepackage{array}
\usepackage{booktabs}

% customization of sections

\titleformat{\section}
 {\bfseries\Large}
 {}% no number
 {0pt}% no space
 {}% the title
 [\titlerule]

% main macros

\newlength{\firstcol}
\newlength{\thirdcol}

% helper column types
\newcolumntype{L}[2]{%
  >{\raggedright\arraybackslash}p{\dimexpr\textwidth-(#1)-#2\tabcolsep\relax}%
}
\newcolumntype{J}[2]{%
  p{\dimexpr\textwidth-(#1)-#2\tabcolsep\relax}%
}

\ExplSyntaxOn

\NewDocumentCommand{\twocolsection}{ O{L} m +m }
 {
  \section{#2}
  \begin{tabular}[t]{
    @{}
    wl{\firstcol}
    #1{\firstcol}{2}
    @{}
  }
  \scw_cv_table:n { #3 }
  \end{tabular}\par
 }
\NewDocumentCommand{\threecolsection}{ O{L} m +m }
 {
  \section{#2}
  \begin{tabular}[t]{
    @{}
    wl{\firstcol}
    #1{\firstcol+\thirdcol}{4}
    wr{\thirdcol}
    @{}
  }
  \scw_cv_table:n { #3 }
  \end{tabular}\par
 }

\seq_new:N \l__scw_cv_rows_seq
\tl_new:N \l__scw_cv_last_tl

\cs_new_protected:Nn \scw_cv_table:n
 {
  % get the rows
  \seq_set_split:Nnn \l__scw_cv_rows_seq { \\ } { #1 }
  % remove the last item if empty
  \seq_pop_right:NN \l__scw_cv_rows_seq \l__scw_cv_last_tl
  \tl_if_blank:VF \l__scw_cv_last_tl
   {% not blank, reinsert it
    \seq_put_right:NV \l__scw_cv_rows_seq \l__scw_cv_last_tl
   }
  % deliver the rows separated by \\ \addlinespace
  \seq_use:Nn \l__scw_cv_rows_seq { \\ \addlinespace }
 }

\ExplSyntaxOff

%%% final customization
\setlength{\firstcol}{1.25in}
\setlength{\thirdcol}{1in}
%\setlength{\defaultaddspace}{0.5em} % this is the default in booktabs
%%%

\begin{document}

\threecolsection{Education}{
  2020 (expected) &Something, somewhere & Ph.D. \\ % or YYYY (expected)
}

\threecolsection{Grants and Scholarships}{
  YYYY & test & bb \\
  YYYY - YYYY & Fellowship & \$ AMOUNT \\ % if normal in your field
}

\twocolsection{Whatever}{
  YYYY & something long to need being split across lines; let's just
         write long enough nonsense and see
}

\twocolsection[J]{Whatever}{
  YYYY & something long to need being split across lines; let's just
         write long enough nonsense and see
}

\end{document}

Sperimenta con diversi valori di \defaultaddspace.

Per trattare anche le sottosezioni, suggerisco una sintassi leggermente diversa che eviti la duplicazione del codice.

\documentclass[11pt]{article}

\usepackage[margin=1in]{geometry} % for margins
\usepackage[american]{babel}      % for language
\usepackage{titlesec}             % to adjust section headers
\usepackage{array}
\usepackage{booktabs}

% customization of sections

\titleformat{\section}
 {\bfseries\Large}
 {}% no number
 {0pt}% no space
 {}% the title
 [\titlerule]
\titlespacing*{\section}{0pt}{*2}{*1}

\titleformat{\subsection}
 {\bfseries\normalsize}
 {}% no number
 {0pt}% no space
 {}% the title
 [\titlerule]
\titlespacing*{\subsection}{0pt}{*1}{*0.5}

% main macros

\newlength{\firstcol}
\newlength{\thirdcol}

% helper column types
\newcolumntype{L}[2]{%
  >{\raggedright\arraybackslash}p{\dimexpr\textwidth-(#1)-#2\tabcolsep\relax}%
}
\newcolumntype{J}[2]{%
  p{\dimexpr\textwidth-(#1)-#2\tabcolsep\relax}%
}

\ExplSyntaxOn

\NewDocumentCommand{\twocol}{ m O{L} m +m }
 {
  #1{#3}
  \begin{tabular}[t]{
    @{}
    wl{\firstcol}
    #2{\firstcol}{2}
    @{}
  }
  \scw_cv_table:n { #4 }
  \end{tabular}\par
 }
\NewDocumentCommand{\threecol}{ m O{L} m +m }
 {
  #1{#3}
  \begin{tabular}[t]{
    @{}
    wl{\firstcol}
    #2{\firstcol+\thirdcol}{4}
    wr{\thirdcol}
    @{}
  }
  \scw_cv_table:n { #4 }
  \end{tabular}\par
 }

\seq_new:N \l__scw_cv_rows_seq
\tl_new:N \l__scw_cv_last_tl

\cs_new_protected:Nn \scw_cv_table:n
 {
  % get the rows
  \seq_set_split:Nnn \l__scw_cv_rows_seq { \\ } { #1 }
  % remove the last item if empty
  \seq_pop_right:NN \l__scw_cv_rows_seq \l__scw_cv_last_tl
  \tl_if_blank:VF \l__scw_cv_last_tl
   {% not blank, reinsert it
    \seq_put_right:NV \l__scw_cv_rows_seq \l__scw_cv_last_tl
   }
  % deliver the rows separated by \\ \addlinespace
  \seq_use:Nn \l__scw_cv_rows_seq { \\ \addlinespace }
 }

\ExplSyntaxOff

%%% final customization
\setlength{\firstcol}{1.25in}
\setlength{\thirdcol}{1in}
%\setlength{\defaultaddspace}{0.5em} % this is the default in booktabs
%%%

\begin{document}

\threecol\section{Education}{
  2020 (expected) &Something, somewhere & Ph.D. \\ % or YYYY (expected)
}

\threecol\section{Grants and Scholarships}{
  YYYY & test & bb \\
  YYYY - YYYY & Fellowship & \$ AMOUNT \\ % if normal in your field
}

\twocol\subsection{Whatever}{
  YYYY & something long to need being split across lines; let's just
         write long enough nonsense and see
}

\twocol\subsection[J]{Whatever}{
  YYYY & something long to need being split across lines; let's just
         write long enough nonsense and see
}

\end{document}