Expandir un diagrama de Gantt automáticamente al ancho de texto de una página

Expandir un diagrama de Gantt automáticamente al ancho de texto de una página

Quiero que casi todos los diagramas de Gantt encajenautomáticamenteal ancho de texto de una página. La gran palabra en esa pregunta esautomático. Y eso es lo que la diferencia de otras preguntas como esa.

Elancho de textoy elrecuento de franjas horariasen el cuadro no están especificados. La solución debe ser lo suficientemente flexible como para encargarse de ello.

Tal vez haya una solución paracalcular x unit? El MWE a continuación tiene 122 intervalos de tiempo. Entonces me pondría x uniten \textwidth divided by 122. ¿Hay una manera de hacer eso?

\documentclass{article}
\usepackage[showframe]{geometry} % show page borders
\usepackage{pgfgantt}

\begin{document}
\noindent
\begin{ganttchart}
    [
        x unit=1.23mm,              % timeslot width
        time slot format=isodate    % Datumsformat
    ]
    {2017-04-01}{2017-07-31}        % from-to (122 days)

    \gantttitle{Gantt-Chart with 122 timeslots}{122}\\
    \ganttbar{Short}{2017-05-01}{2017-06-01}\\
    \ganttbar{Long Long}{2017-05-25}{2017-06-04}\\
\end{ganttchart}
\end{document}

Respuesta1

Luego de la discusión en el chat, esta es una adaptación de la respuesta de Alan que implementa la sintaxis que estaba tratando de realizar.

% addaswyd o ateb Alan Munn: https://tex.stackexchange.com/questions/364944/expand-a-gantt-chart-automatically-to-textwidth-of-a-page/364969#364969 a chwestiwn buhtz: https://tex.stackexchange.com/questions/364944/expand-a-gantt-chart-automatically-to-textwidth-of-a-page
\documentclass[a4paper]{article}
\usepackage[showframe]{geometry} % show page borders
\parindent=0pt
\usepackage{pgfgantt}
\makeatletter
\tikzset{%
  /pgfgantt/time slots/.code={%
    \tikzset{%
      /pgfgantt/time slots/.cd,
      #1,
      /pgfgantt/.cd,
    }%
  },
  /pgfgantt/time slots/.search also={/pgfgantt},
  /pgfgantt/time slots/.cd,
  width/.store in=\ts@width,
  width=\textwidth,
  slots/.store in=\totaltimeslots,
  slots=20,
  label width/.store in=\ts@labelwidth,
  label width=25mm,
  calc x unit/.code n args=3{%
    \pgfmathsetmacro\ts@xunit{(#1-#2-0.6667em-2*\pgflinewidth)/#3}%
    \tikzset{%
      /pgfgantt/x unit=\ts@xunit pt,
    }%
  },
  widest/.code={%
    \pgfmathsetmacro\ts@wdlabel{width("#1")}%
    \tikzset{/pgfgantt/time slots/label width=\ts@wdlabel pt}%
  },
  calc x unit aux width/.style={/pgfgantt/time slots/calc x unit={#1}{\ts@labelwidth}{\totaltimeslots}},
  calc x unit aux label width/.style={/pgfgantt/time slots/calc x unit={\ts@width}{#1}{\totaltimeslots}},
  calc x unit aux slots/.style={/pgfgantt/time slots/calc x unit={\ts@width}{\ts@labelwidth}{#1}},
  width/.forward to=/pgfgantt/time slots/calc x unit aux width,
  slots/.forward to=/pgfgantt/time slots/calc x unit aux slots,
  label width/.forward to=/pgfgantt/time slots/calc x unit aux label width,
}
\makeatother
\begin{document}
\begin{ganttchart}
    [
        time slots={slots=122, widest=Long Long},
        time slot format=isodate,
    ]
    {2017-04-01}{2017-07-31}        % from-to (122 days)

    \gantttitle{Gantt-Chart with 122 timeslots}{\totaltimeslots}\\
    \ganttbar{Short}{2017-05-01}{2017-06-01}\\
    \ganttbar{Long Long}{2017-05-25}{2017-06-04}\\
\end{ganttchart}

\begin{ganttchart}
    [
        time slots/slots=15,
        time slots/widest=Foo,
        time slots/width=.9\linewidth,
        time slot format=isodate,
    ]
    {2017-04-01}{2017-04-15}        % from-to (122 days)
    \gantttitle{Gantt-Chart with 15 timeslots}{15}\\
    \ganttbar{Foo}{2017-05-25}{2017-06-04}
\end{ganttchart}
\end{document}

Respuesta2

Utilice el calcpaquete para establecer la longitud que necesite. Dado que el número de intervalos de tiempo debe configurarse manualmente en el \ganttitlecomando, he creado un ganttchartestilo timeslotsque toma como argumentos el número de intervalos para el gráfico y el texto de la \gantttitleetiqueta más larga (separado por comas) y luego lo usa para calcular la anchura. También establece el valor de una macro \timeslotsque luego se puede usar en el \gantttitlecomando.

Agregué el código como un ganttchartestilo, para que pueda especificarse sin su propia macro como en la versión anterior (consulte el historial de edición para obtener más detalles). También agregué una longitud para el ancho con el que desea que sea relativo el tamaño automático. Para su ejemplo específico, está configurado en \textwidth, pero esto le permite configurarlo en cualquier ancho que desee.

Uso:[ ..., timeslots={<number>,<text of longest label>}, ... ]

\usepackage[]{geometry} % show page borders
\parindent=0pt
\usepackage{pgfgantt}
\usepackage{calc}
\newlength{\myunitx}
\newlength{\autosizewidth}
\setlength{\autosizewidth}{\textwidth} % this allows you to change the value for autosizing
\newcommand*{\timeslots}{}
\ganttset{
timeslots/.code args={#1,#2}{\setlength{\myunitx}{(\autosizewidth-\widthof{#2}-1em)/#1}
                 \renewcommand{\timeslots}{#1}\pgfkeys{pgfgantt/x unit=\myunitx}}
}
\begin{document}

\begin{ganttchart}
    [
        timeslots={122,Long Long},  % timeslots
        time slot format=isodate    % Datumsformat
    ]
    {2017-04-01}{2017-07-31}        % from-to (122 days)

    \gantttitle{Gantt-Chart with 122 timeslots}{\timeslots}\\
    \ganttbar{Short}{2017-05-01}{2017-06-01}\\
    \ganttbar{Long Long}{2017-05-25}{2017-06-04}\\
    \end{ganttchart}

\begin{ganttchart}
    [
        timeslots={15,Foo},         % timeslots
        time slot format=isodate    % Datumsformat
    ]
    {2017-04-01}{2017-04-15}        % from-to (122 days)
    \gantttitle{Gantt-Chart with 15 timeslots}{15}\\
    \ganttbar{Foo}{2017-05-25}{2017-06-04}
\end{ganttchart}
\end{document}

salida de código

información relacionada