Compare commits

...

2 Commits

Author SHA1 Message Date
Julien Calixte
c72a95d942 docs(design): title the House of Quality with name and concept
Some checks failed
Deploy to GitHub Pages / build (push) Failing after 1m8s
Deploy to GitHub Pages / deploy (push) Has been skipped
2026-06-25 11:42:11 +01:00
Julien Calixte
e392eca51b docs(design): resync House of Quality preamble to canonical reference
The embedded preamble had drifted from the qfd skill's reference: it
lacked the title-block machinery, section comments, and sizing notes.
Replace it verbatim so future edits don't fight stale scaffolding.
2026-06-25 11:41:50 +01:00

View File

@@ -127,8 +127,26 @@ Strength of each Component in realising each Function (9/3/1/blank). Component l
% ===================================================================== % =====================================================================
% QFD "House of Quality" preamble % QFD "House of Quality" preamble
% ===================================================================== % =====================================================================
% Usage:
% \begin{document}
% \begin{qfdhouse}
% % WHATs at ({\qfdLeftEdge + 0.1}, {-\r + 0.5})
% % Importance at ({-\qfdImpW/2}, {-\r + 0.5})
% % HOWs rotated 90 at ({\c - 0.5}, 0.15)
% % Relations in cells with [qfdrel/S], [qfdrel/M], [qfdrel/W]
% % Roof correlations at (C-i-j)
% % Perception markers at ({\qfdNH + (s+0.5)*\qfdCmpW/6}, {-\r + 0.5})
% % Basement: target / difficulty / abs weight / rel weight, per HOW
% \end{qfdhouse}
% \end{document}
%
% NB: in node text, use $<$ / $>$ for less-than / greater-than under
% OT1 encoding; bare < and > render as Spanish ¡ ¿.
% =====================================================================
\usetikzlibrary{arrows.meta, positioning, shapes.geometric, shapes.misc, calc, fit, backgrounds} \usetikzlibrary{arrows.meta, positioning, shapes.geometric, shapes.misc, calc, fit, backgrounds}
% Toggles — flip before \begin{qfdhouse} to hide sections.
\newif\ifqfdshowroof \qfdshowrooftrue \newif\ifqfdshowroof \qfdshowrooftrue
\newif\ifqfdshowbasement \qfdshowbasementtrue \newif\ifqfdshowbasement \qfdshowbasementtrue
\newif\ifqfdshowcompetitive \qfdshowcompetitivetrue \newif\ifqfdshowcompetitive \qfdshowcompetitivetrue
@@ -136,27 +154,36 @@ Strength of each Component in realising each Function (9/3/1/blank). Component l
\newif\ifqfdshowimportance \qfdshowimportancetrue \newif\ifqfdshowimportance \qfdshowimportancetrue
\newif\ifqfdshowcorrlegend \qfdshowcorrlegendtrue \newif\ifqfdshowcorrlegend \qfdshowcorrlegendtrue
\newif\ifqfdshowevallegend \qfdshowevallegendtrue \newif\ifqfdshowevallegend \qfdshowevallegendtrue
\newif\ifqfdshowtitle \qfdshowtitletrue % title block above the roof
\def\qfdNW{5} % Dimensions — override before \begin{qfdhouse} to resize.
\def\qfdNH{5} \def\qfdNW{5} % number of WHATs (rows)
\def\qfdWhatW{4.0} \def\qfdNH{5} % number of HOWs (columns)
\def\qfdImpW{0.9} \def\qfdWhatW{4.0} % width of WHATs column
\def\qfdCmpW{3} \def\qfdImpW{0.9} % width of importance column
\def\qfdHdrH{2.6} \def\qfdCmpW{3} % width of perception zone
\def\qfdBasementN{4} \def\qfdHdrH{2.6} % height of column-titles band
\def\qfdBasementN{4} % number of basement rows
% Titles & labels — override before \begin{qfdhouse}.
\def\qfdWhatsTitle{Customer needs} \def\qfdWhatsTitle{Customer needs}
\def\qfdImpTitle{Imp.\ \%} \def\qfdImpTitle{Imp.\ \%}
\def\qfdPerceptionTitle{Comparative evaluation} \def\qfdPerceptionTitle{Comparative evaluation}
\def\qfdPoorLabel{poor} \def\qfdPoorLabel{poor}
\def\qfdExcellentLabel{excellent} \def\qfdExcellentLabel{excellent}
\def\qfdAltOneLabel{Our product} \def\qfdAltOneLabel{Our product} % highlighted in legend
\def\qfdAltTwoLabel{Competitor A} \def\qfdAltTwoLabel{Competitor A}
\def\qfdAltThreeLabel{Competitor B} \def\qfdAltThreeLabel{Competitor B}
\def\qfdRelTitle{Relation} \def\qfdRelTitle{Relation}
\def\qfdCorrTitle{Correlation} \def\qfdCorrTitle{Correlation}
\def\qfdEvalTitle{Evaluation} \def\qfdEvalTitle{Evaluation}
% Title block above the roof — set both to name the house. Leave
% \qfdProjectTitle empty (default) to draw no title at all.
\def\qfdProjectTitle{} % project / feature name (large, bold)
\def\qfdConcept{} % concept in one sentence; \textbf{} the keywords
% Styles.
\tikzset{ \tikzset{
qfdthin/.style ={line width=0.35pt}, qfdthin/.style ={line width=0.35pt},
qfdmed/.style ={line width=0.7pt}, qfdmed/.style ={line width=0.7pt},
@@ -170,6 +197,7 @@ Strength of each Component in realising each Function (9/3/1/blank). Component l
qfdrel/S/.style={qfdstrong}, qfdrel/S/.style={qfdstrong},
qfdrel/M/.style={qfdmod}, qfdrel/M/.style={qfdmod},
qfdrel/W/.style={qfdweak}, qfdrel/W/.style={qfdweak},
% Three perception-zone alternatives. Index 1 is emphasised.
qfdalt1mk/.style={circle, draw, fill=black, qfdalt1mk/.style={circle, draw, fill=black,
minimum size=6pt, inner sep=0pt, line width=1pt}, minimum size=6pt, inner sep=0pt, line width=1pt},
qfdalt1ln/.style={line width=1.2pt}, qfdalt1ln/.style={line width=1.2pt},
@@ -182,6 +210,7 @@ Strength of each Component in realising each Function (9/3/1/blank). Component l
qfdalt3ln/.style={line width=0.7pt, dotted}, qfdalt3ln/.style={line width=0.7pt, dotted},
} }
% --- Grid lines for every zone. ---
\newcommand{\qfdDrawGrid}{% \newcommand{\qfdDrawGrid}{%
\foreach \c in {1,...,\qfdNHm} \draw[qfdthin] (\c, 0) -- (\c, -\qfdNW); \foreach \c in {1,...,\qfdNHm} \draw[qfdthin] (\c, 0) -- (\c, -\qfdNW);
\foreach \r in {1,...,\qfdNWm} \draw[qfdthin] (0, -\r) -- (\qfdNH, -\r); \foreach \r in {1,...,\qfdNWm} \draw[qfdthin] (0, -\r) -- (\qfdNH, -\r);
@@ -203,6 +232,7 @@ Strength of each Component in realising each Function (9/3/1/blank). Component l
\fi \fi
} }
% --- Roof: diagonal grid + named coordinates (C-i-j) for correlations. ---
\newcommand{\qfdDrawRoof}{% \newcommand{\qfdDrawRoof}{%
\ifqfdshowroof \ifqfdshowroof
\foreach \k in {1,...,\qfdNHm} {% \foreach \k in {1,...,\qfdNHm} {%
@@ -227,6 +257,7 @@ Strength of each Component in realising each Function (9/3/1/blank). Component l
\fi \fi
} }
% --- Perception scale 0..5 + poor/excellent endpoints + zone title. ---
\newcommand{\qfdDrawScale}{% \newcommand{\qfdDrawScale}{%
\ifqfdshowcompetitive \ifqfdshowcompetitive
\foreach \tk in {0,1,2,3,4,5} {% \foreach \tk in {0,1,2,3,4,5} {%
@@ -242,6 +273,7 @@ Strength of each Component in realising each Function (9/3/1/blank). Component l
\fi \fi
} }
% --- Importance title (left) and WHATs title (header band). ---
\newcommand{\qfdDrawZoneTitles}{% \newcommand{\qfdDrawZoneTitles}{%
\ifqfdshowimportance \ifqfdshowimportance
\node[rotate=90, anchor=west, font=\footnotesize\bfseries] \node[rotate=90, anchor=west, font=\footnotesize\bfseries]
@@ -252,6 +284,25 @@ Strength of each Component in realising each Function (9/3/1/blank). Component l
{\ifqfdshowroof \qfdHdrH/2 \else 0.6 \fi}) {\qfdWhatsTitle}; {\ifqfdshowroof \qfdHdrH/2 \else 0.6 \fi}) {\qfdWhatsTitle};
} }
% --- Title + concept subtitle, centred above the roof apex. ---
\newcommand{\qfdDrawTitle}{%
\ifqfdshowtitle
\ifx\qfdProjectTitle\empty\else
\pgfmathsetmacro{\qfdTitleX}{\qfdNH/2}
\pgfmathsetmacro{\qfdTitleY}{\ifqfdshowroof \qfdApexY \else \qfdHdrH \fi + 0.9}
\pgfmathsetmacro{\qfdSubW}{\qfdNH + 2} % pre-computed (braces don't do arithmetic)
\node[anchor=south, font=\large\bfseries, align=center]
at (\qfdTitleX, \qfdTitleY) {\qfdProjectTitle};
\ifx\qfdConcept\empty\else
\node[anchor=north, font=\footnotesize\itshape, align=center,
text width=\qfdSubW cm]
at (\qfdTitleX, {\qfdTitleY - 0.1}) {\qfdConcept};
\fi
\fi
\fi
}
% --- Outer frames around each zone. ---
\newcommand{\qfdDrawFrames}{% \newcommand{\qfdDrawFrames}{%
\begin{scope}[qfdmed] \begin{scope}[qfdmed]
\draw (\qfdLeftEdge, 0) rectangle (\qfdNH, -\qfdNW); \draw (\qfdLeftEdge, 0) rectangle (\qfdNH, -\qfdNW);
@@ -266,6 +317,7 @@ Strength of each Component in realising each Function (9/3/1/blank). Component l
\end{scope} \end{scope}
} }
% --- Legend on the right (Relations / Correlations / Evaluation). ---
\newcommand{\qfdDrawLegend}{% \newcommand{\qfdDrawLegend}{%
\ifqfdshowlegend \ifqfdshowlegend
\pgfmathsetmacro{\qfdLegX}{% \pgfmathsetmacro{\qfdLegX}{%
@@ -278,6 +330,7 @@ Strength of each Component in realising each Function (9/3/1/blank). Component l
\begin{scope}[shift={(\qfdLegX, \qfdLegY)}] \begin{scope}[shift={(\qfdLegX, \qfdLegY)}]
\draw[qfdmed, rounded corners=2pt] \draw[qfdmed, rounded corners=2pt]
(-0.15, 0.4) rectangle (4.5, \qfdLegBottom); (-0.15, 0.4) rectangle (4.5, \qfdLegBottom);
% Relations
\node[anchor=west, font=\footnotesize\bfseries] at (0, 0.1) \node[anchor=west, font=\footnotesize\bfseries] at (0, 0.1)
{\qfdRelTitle}; {\qfdRelTitle};
\draw[qfdthin] (0, -0.15) -- (4.35, -0.15); \draw[qfdthin] (0, -0.15) -- (4.35, -0.15);
@@ -287,6 +340,7 @@ Strength of each Component in realising each Function (9/3/1/blank). Component l
\node[anchor=west] at (0.5, -0.95) {Medium (3)}; \node[anchor=west] at (0.5, -0.95) {Medium (3)};
\node[qfdweak] at (0.22, -1.4) {}; \node[qfdweak] at (0.22, -1.4) {};
\node[anchor=west] at (0.5, -1.4) {Weak (1)}; \node[anchor=west] at (0.5, -1.4) {Weak (1)};
% Correlations (roof)
\ifqfdshowroof \ifqfdshowcorrlegend \ifqfdshowroof \ifqfdshowcorrlegend
\node[anchor=west, font=\footnotesize\bfseries] at (0, -2.10) \node[anchor=west, font=\footnotesize\bfseries] at (0, -2.10)
{\qfdCorrTitle}; {\qfdCorrTitle};
@@ -296,6 +350,7 @@ Strength of each Component in realising each Function (9/3/1/blank). Component l
\node[anchor=west] at (0, -3.40) {{$-$\phantom{$-$}}\quad negative}; \node[anchor=west] at (0, -3.40) {{$-$\phantom{$-$}}\quad negative};
\node[anchor=west] at (0, -3.75) {{$-\!-$}\quad very negative}; \node[anchor=west] at (0, -3.75) {{$-\!-$}\quad very negative};
\fi \fi \fi \fi
% Evaluation (3 alternatives)
\ifqfdshowcompetitive \ifqfdshowevallegend \ifqfdshowcompetitive \ifqfdshowevallegend
\pgfmathsetmacro{\qfdEvalTop}{% \pgfmathsetmacro{\qfdEvalTop}{%
-2.10 \ifqfdshowroof\ifqfdshowcorrlegend - 2.55 \fi\fi} -2.10 \ifqfdshowroof\ifqfdshowcorrlegend - 2.55 \fi\fi}
@@ -321,6 +376,7 @@ Strength of each Component in realising each Function (9/3/1/blank). Component l
\fi \fi
} }
% --- The environment users wrap their content in. ---
\newenvironment{qfdhouse}{% \newenvironment{qfdhouse}{%
\begin{tikzpicture}[x=1cm, y=1cm, font=\scriptsize, \begin{tikzpicture}[x=1cm, y=1cm, font=\scriptsize,
line cap=round, line join=round] line cap=round, line join=round]
@@ -336,18 +392,22 @@ Strength of each Component in realising each Function (9/3/1/blank). Component l
\qfdDrawRoof \qfdDrawRoof
\qfdDrawScale \qfdDrawScale
\qfdDrawZoneTitles \qfdDrawZoneTitles
\qfdDrawTitle
}{% }{%
\qfdDrawFrames \qfdDrawFrames
\qfdDrawLegend \qfdDrawLegend
\end{tikzpicture}% \end{tikzpicture}%
} }
% --- Macroplan house: 5 WHATs, 7 HOWs, no competitor zone --- % --- Macroplan house: 5 WHATs, 7 HOWs, no competitor zone ---
\def\qfdNW{5} \def\qfdNW{5}
\def\qfdNH{7} \def\qfdNH{7}
\def\qfdWhatW{4.6} \def\qfdWhatW{4.6}
\def\qfdWhatsTitle{Goals (WHATs)} \def\qfdWhatsTitle{Goals (WHATs)}
\def\qfdImpTitle{Weight} \def\qfdImpTitle{Weight}
\def\qfdProjectTitle{Macroplan}
\def\qfdConcept{A \textbf{week-granular} plan view that holds every
\textbf{Feature} honest against its \textbf{Original Estimate} and turns
the slips into captured \textbf{Learnings}.}
\qfdshowcompetitivefalse \qfdshowcompetitivefalse
\begin{document} \begin{document}