texlive[52946] Master/texmf-dist: pinoutikz (27nov19)

commits+karl at tug.org commits+karl at tug.org
Wed Nov 27 23:04:46 CET 2019


Revision: 52946
          http://tug.org/svn/texlive?view=revision&revision=52946
Author:   karl
Date:     2019-11-27 23:04:46 +0100 (Wed, 27 Nov 2019)
Log Message:
-----------
pinoutikz (27nov19)

Modified Paths:
--------------
    trunk/Master/texmf-dist/doc/latex/pinoutikz/README.md
    trunk/Master/texmf-dist/doc/latex/pinoutikz/pinoutikz_doc_en.pdf
    trunk/Master/texmf-dist/doc/latex/pinoutikz/pinoutikz_doc_en.tex
    trunk/Master/texmf-dist/tex/latex/pinoutikz/pinoutikz.sty

Modified: trunk/Master/texmf-dist/doc/latex/pinoutikz/README.md
===================================================================
--- trunk/Master/texmf-dist/doc/latex/pinoutikz/README.md	2019-11-27 22:04:35 UTC (rev 52945)
+++ trunk/Master/texmf-dist/doc/latex/pinoutikz/README.md	2019-11-27 22:04:46 UTC (rev 52946)
@@ -1,15 +1,17 @@
 							_________________
 
 							pinoutikz package
-								v 1.0.1
-							   2019/11/23
+								  1.1.0
+							   2019/11/25
 							_________________
 
-This package provides macros manipulating for generating chip pinout diagrams.
+This package provides macros for chip pinout diagrams typesetting.
 
 Main features are:
   * pinout diagrams:
      - PDIP packages
+	 - TQFP packages
+	 - PLCC packages
   * formatting of pin labels:
      - logical negation (show as a text with oveeline).
 
@@ -17,10 +19,21 @@
   * pinoutikz.sty (the package itself)
   * pinoutikz_doc.tex and pinoutikz_doc.pdf (manual in english)
     - this one substitutes for a quick test as well
-  * README (this file)
+  * README.md (this file)
 
 ##############################################################################
 							  Robert Blazek
 							 <robert.h.blazek at gmail.com>
 
+License:
+------------------------------------------------------------------------------
 This material is subject to the LATEX Project Public License 1.3c
+
+Change history:
+------------------------------------------------------------------------------
+Version 1.1.0, 2019/11/25 (against 1.0.1)
+* New packages added: TQFP, PLCC
+* Pin label syntax changed -> <pin position>/<pin label>
+
+Version 1.0.1 2019/11/23 
+* version created

Modified: trunk/Master/texmf-dist/doc/latex/pinoutikz/pinoutikz_doc_en.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/pinoutikz/pinoutikz_doc_en.tex
===================================================================
--- trunk/Master/texmf-dist/doc/latex/pinoutikz/pinoutikz_doc_en.tex	2019-11-27 22:04:35 UTC (rev 52945)
+++ trunk/Master/texmf-dist/doc/latex/pinoutikz/pinoutikz_doc_en.tex	2019-11-27 22:04:46 UTC (rev 52946)
@@ -97,7 +97,7 @@
 		\begin{minipage}{0.85\linewidth}
 			\noindent
 			\hfill\textbf{\textit{Abstract}}\hfill{}\medskip\par
-			This package which requires $\varepsilon$-\TeX{}, provides macros manipulating strings of tokens. For a basic use, tokens can be alphanumeric chars, but the macros can also be useful for manipulating tokens, i.e. \TeX{} code. 
+			This package which requires $\varepsilon$-\TeX{}, provides macros for creating pinout diagrams of chips. 
 
 		\end{minipage}
 	\end{center}
@@ -118,7 +118,7 @@
 This is my first latex package documentation ever - and since I hate reinventing the wheel - this manual has been based upon that of \textbf{xstrings} - with the courtesy of the author, of course.
 
 \section{The macros}
-For a better understanding, let's see first the macros with the simpler arguments possible. No special catcode, no exotic token, no control sequence neither: only alphanumeric chars will be contained in the arguments.\medskip
+For a better understanding, let's see first the macros with the simpler arguments possible. No special catcode, no exotic token, no control sequence either: only alphanumeric chars will be contained in the arguments.\medskip
 
 In the following chapters, all the macros will be presented this way:
 \begin{itemize}
@@ -133,12 +133,14 @@
 
 \subsection{The pinout diagrams}
 \subsubsection{\ttfamily\textbackslash PDIP}
-\verbinline|\PDIP|\arguD{pinnumber}\ARGU{pinarray}
+\verbinline|\PDIP|\arguD{pincount}\ARGU{pinarray}
 \smallskip
 
+Draws a PDIP package, with generic number of pins.
+
 \begin{itemize}
-	\item \argu{pinnumber} thethe  number of pins of a DIP package and should be an even number.
-	\item \ARGU{pinarray} is a list of pins - position of every pin's description is defined by its position in this array.
+	\item \argu{pincount} the  number of pins of a DIP package and should be an even number.
+	\item \ARGU{pinarray} is a comma-separated list of pins  - each pin definition is as follows: \argu{pinnumber}/\ARGU{pinlabel}.
 \end{itemize}
 
 %% 4-pin example
@@ -147,16 +149,16 @@
 \begin{figure}
   \centering
   \PDIP(4){%
-  	1/E,2/B,3/NC,4/C}
+  	1/{E},2/B,3/NC,4/C}
   \caption{NPN-Transistor, 4-pin PDIP package} \label{fig:X_DIP4}
 \end{figure}
 \end{lstlisting}%
 
 %% 4-pin example
-\begin{figure}
+\begin{figure}[ht!]
   \centering
   \PDIP(4){%
-  	1/E,
+  	1/{E},
   	2/B,
   	3/NC,
   	4/C
@@ -176,7 +178,7 @@
   	3/B,
   	4/GND,
   	5/Y,
-  	6/\FormatPinLabel{~Y~},
+  	6/{\FormatPinLabel{~Y~}/RESET},
   	7/NC,
   	8/$V_{cc}$%
   	}
@@ -185,7 +187,7 @@
 \end{lstlisting}%
 
 %% 8-pin example
-\begin{figure}
+\begin{figure}[ht!]
   \centering
   \PDIP(8){%
   	1/CLK,
@@ -193,60 +195,234 @@
   	3/B,
   	4/GND,
   	5/Y,
-  	6/\FormatPinLabel{~Y~},
+  	6/{\FormatPinLabel{~Y~}/RESET},
   	7/NC,
   	8/$V_{cc}$%
   	}
   \caption{TTL logic chip, 8-pin PDIP package} \label{fig:X_DIP8}
 \end{figure}
+%\end{minipage}\hfill
 
-%\end{minipage}\hfill
 %% 14-pin example
-%\begin{minipage}[t]{0.65\linewidth}
-\begin{lstlisting}
-\begin{figure}
+\begin{figure}[ht!]
   \centering
   \PDIP(14){%
-  	1/A1,										%1
-  	2/B1,										%2
-  	3/\FormatPinLabel{\#1 AND/~OR~/GPIO1},			%3
-  	4/Y1,										%4
-  	5/C1,										%5
-  	6/\FormatPinLabel{\#2 AND/~OR~/GPIO2},			%6
-  	7/GND,									%7
-  	8/PCLK,									%8
-  	9/PDAT,									%9
-  	10/A2,									%10
-  	11/B2,									%11
-  	12/\FormatPinLabel{\#2 INV/~SME~/GPIO3},		%12
-  	13/C2,									%13
-  	14/$V_{cc}$}								%14
+  	1/A1,									
+  	2/B1,									
+  	3/\FormatPinLabel{\#1 AND/~OR~/GPIO1},		
+  	4/Y1,									
+  	5/C1,									
+  	6/\FormatPinLabel{\#2 AND/~OR~/GPIO2},		
+  	7/GND,								
+  	8/PCLK,								
+  	9/PDAT,								
+  	10/A2,								
+  	11/B2,								
+  	12/\FormatPinLabel{\#2 INV/~SME~/GPIO3},	
+  	13/C2,								
+  	14/$V_{cc}$}							
   \caption{Generic programmable TTL logic chip, 14-pin PDIP package} \label{fig:X_DIP14}
 \end{figure}
-\end{lstlisting}%
-%\end{minipage}\hfill
 
 %% 14-pin example
-\begin{figure}
+\begin{minipage}[t]{0.65\linewidth}
+\begin{lstlisting}
+\begin{figure}[ht!]
   \centering
   \PDIP(14){%
-  	1/A1,									%1
-  	2/B1,									%2
-  	3/\FormatPinLabel{\#1 AND/~OR~/GPIO1},		%3
-  	4/Y1,									%4
-  	5/C1,									%5
-  	6/\FormatPinLabel{\#2 AND/~OR~/GPIO2},		%6
-  	7/GND,								%7
-  	8/PCLK,								%8
-  	9/PDAT,								%9
-  	10/A2,								%10
-  	11/B2,								%11
-  	12/\FormatPinLabel{\#2 INV/~SME~/GPIO3},	%12
-  	13/C2,								%13
-  	14/$V_{cc}$}							%14
+  	1/A1,										
+  	2/B1,										
+  	3/\FormatPinLabel{\#1 AND/~OR~/GPIO1},			
+  	4/Y1,										
+  	5/C1,										
+  	6/\FormatPinLabel{\#2 AND/~OR~/GPIO2},			
+  	7/GND,									
+  	8/PCLK,									
+  	9/PDAT,									
+  	10/A2,									
+  	11/B2,									
+  	12/\FormatPinLabel{\#2 INV/~SME~/GPIO3},		
+  	13/C2,									
+  	14/$V_{cc}$}								
   \caption{Generic programmable TTL logic chip, 14-pin PDIP package} \label{fig:X_DIP14}
 \end{figure}
+\end{lstlisting}%
+\end{minipage}\hfill
 
+\subsubsection{\ttfamily\textbackslash TQFP}
+\verbinline|\TQFP|\arguD{pinnumber}\ARGU{pinarray}
+\smallskip
+
+\begin{itemize}
+	\item \argu{pincount} the  number of pins of a DIP package and should be an even number.
+	\item \ARGU{pinarray} is a comma-separated list of pins  - each pin definition is as follows: \argu{pinnumber}/\ARGU{pinlabel}.
+\end{itemize}
+
+%% 32-pin TQFP example
+\begin{minipage}[t]{0.65\linewidth}
+\begin{lstlisting}
+\begin{figure}[ht!]
+  \centering
+  \TQFP(32){%
+  	1/{PD.0/RTX1},
+  	2/{PA.0/STX1},
+  	3/PA.1,										
+  	4/PA.2,										
+  	5/PA.3,										
+  	6/PA.4,										
+  	7/PA.5,										
+  	8/GND,									
+  	9/PA.6,
+  	10/PA.7,
+  	11/{PB.0/RTX1},
+  	12/{PB.1/STX1},
+  	13/PB.2,										
+  	14/PB.3,										
+  	15/PB.4,										
+  	16/PB.5,										
+  	17/PB.6,										
+  	18/PB.7,										
+  	19/\FormatPinLabel{PC.0/~ALE~/PLPBC0},
+  	20/PC.1,										
+  	21/PC.2,										
+  	22/PC.3,										
+  	23/PC.4,										
+  	24/PC.5,										
+  	25/PC.6,									
+  	26/PC.7,
+  	27/XTAL1/PD.3,
+  	28/XTAL2/PD.4,
+  	29/RST,
+  	30/PD.1,										
+  	31/PD.2,										
+  	32/$V_{cc}$}								
+  \caption{A generic MCU chip, 32-pin TQFP package} \label{fig:X_TQFP32}
+\end{figure}
+\end{lstlisting}%
+\end{minipage}\hfill
+
+%% 32-pin TQFP example
+\begin{figure}[ht!]
+  \centering
+  \TQFP(32){%
+  	1/{PD.0/RTX1},
+  	2/{PA.0/STX1},
+  	3/PA.1,										
+  	4/PA.2,										
+  	5/PA.3,										
+  	6/PA.4,										
+  	7/PA.5,										
+  	8/GND,									
+  	9/PA.6,										
+  	10/PA.7,										
+  	11/{PB.0/RTX1},
+  	12/{PB.1/STX1},
+  	13/PB.2,
+  	14/PB.3,
+  	15/PB.4,
+  	16/PB.5,
+  	17/PB.6,
+  	18/PB.7,
+  	19/\FormatPinLabel{PC.0/~ALE~/PLPBC0},
+  	20/PC.1,
+  	21/PC.2,
+  	22/PC.3,
+  	23/PC.4,
+  	24/PC.5,
+  	25/PC.6,
+  	26/PC.7,
+  	27/XTAL1/PD.3,
+  	28/XTAL2/PD.4,
+  	29/RST,
+  	30/PD.1,
+  	31/PD.2,
+  	32/$V_{cc}$}
+  \caption{A generic MCU chip, 32-pin TQFP package} \label{fig:X_TQFP32}
+\end{figure}
+
+\subsubsection{\ttfamily\textbackslash PLCC}
+\verbinline|\PLCC|\arguD{pinnumber}\ARGU{pinarray}
+\smallskip
+
+\begin{itemize}
+	\item \argu{pincount} the  number of pins of a DIP package and should be an even number.
+	\item \ARGU{pinarray} is a comma-separated list of pins  - each pin definition is as follows: \argu{pinnumber}/\ARGU{pinlabel}.
+\end{itemize}
+
+%% 28-pin PLCC example
+\begin{minipage}[t]{0.65\linewidth}
+\begin{lstlisting}
+\begin{figure}[ht!]
+  \centering
+  \PLCC(28){%
+  	1/{PD.0/RTX1},
+  	2/{PA.0/STX1},
+  	3/PA.1,										
+  	4/PA.2,										
+  	5/PA.3,										
+  	6/PA.4,										
+  	7/PA.5,										
+  	8/GND,									
+  	9/PA.6,
+  	10/PA.7,
+  	11/{PB.0/RTX1},
+  	12/{PB.1/STX1},
+  	13/PB.2,										
+  	14/PB.3,										
+  	15/PB.4,										
+  	16/PB.5,										
+  	17/PB.6,										
+  	18/PB.7,										
+  	19/\FormatPinLabel{PC.0/~ALE~/PLPBC0},
+  	20/PC.1,										
+  	21/PC.2,										
+  	22/PC.3,										
+  	23/{XTAL1/PD.3},
+  	24/{XTAL2/PD.4},
+  	25/RST,
+  	26/PD.1,										
+  	27/PD.2,										
+  	28/$V_{cc}$}								
+  \caption{A generic MCU chip, 28-pin PLCC package} \label{fig:X_PLCC28}
+\end{figure}
+\end{lstlisting}%
+\end{minipage}\hfill
+
+%% 28-pin PLCC example
+\begin{figure}[ht!]
+  \centering
+  \PLCC(28){%
+  	1/{PD.0/RTX1},
+  	2/{PA.0/STX1},
+  	3/PA.1,										
+  	4/PA.2,										
+  	5/PA.3,										
+  	6/PA.4,										
+  	7/PA.5,										
+  	8/GND,									
+  	9/PA.6,										
+  	10/PA.7,										
+  	11/{PB.0/RTX1},
+  	12/{PB.1/STX1},
+  	13/PB.2,
+  	14/PB.3,
+  	15/PB.4,
+  	16/PB.5,
+  	17/PB.6,
+  	18/PB.7,
+  	19/\FormatPinLabel{PC.0/~ALE~/PLPBC0},
+  	20/PC.1,
+  	21/PC.2,
+  	22/PC.3,
+  	23/{XTAL1/PD.3},
+  	24/{XTAL2/PD.4},
+  	25/RST,
+  	26/PD.1,
+  	27/PD.2,
+  	28/$V_{cc}$}
+  \caption{A generic MCU chip, 28-pin PLCC package} \label{fig:X_PLCC28}
+\end{figure}
+
 %% Examples for PDIP packages
 \begin{minipage}[t]{0.35\linewidth}
 	\styleexemple

Modified: trunk/Master/texmf-dist/tex/latex/pinoutikz/pinoutikz.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/pinoutikz/pinoutikz.sty	2019-11-27 22:04:35 UTC (rev 52945)
+++ trunk/Master/texmf-dist/tex/latex/pinoutikz/pinoutikz.sty	2019-11-27 22:04:46 UTC (rev 52946)
@@ -1,5 +1,8 @@
+% License: 	LATEX Project Public License 1.3c
+% Author: 	Robert Blazek
+% Date:		2019/11/25 
 \NeedsTeXFormat{LaTeX2e}[1994/06/01]
-\ProvidesPackage{pinoutikz}[1.0.1 Pinout diagram definitions]
+\ProvidesPackage{pinoutikz}[1.1.0 Pinout diagram definitions]
 
 \RequirePackage{ifthen}
 \RequirePackage{lmodern}
@@ -9,6 +12,7 @@
 \RequirePackage{amsfonts}
 \RequirePackage{forarray}
 \RequirePackage{arrayjob}
+\RequirePackage{pgf}
 \RequirePackage{tikz}
 
 %% 'sans serif' option
@@ -31,9 +35,11 @@
 
 \ProcessOptions\relax
 
+\usetikzlibrary{shapes.misc, shapes.geometric}
+
 \def\pinoutikzname               {pinouTikz}
-\def\pinoutikzversion            {1.0.1}
-\def\pinoutikzdate                 {2019/11/23}
+\def\pinoutikzversion            {1.1.0}
+\def\pinoutikzdate               {2019/11/25}
 
 %% Formatt a pin name
 \def\FormatPinLabel#1{
@@ -51,6 +57,18 @@
   {#1}
 }
 
+%% package rectangle
+\def\CASE(#1)#2#3#4 {%
+  \ifthenelse{\equal{#1}{TQFP}}{%
+    \node[draw=black, rectangle,minimum width=#3,minimum height=#4,line width=1.5pt, chamfered rectangle, chamfered rectangle corners={north west, north east, south east, south west}] at (#2) (case) {};
+    \draw (-.39 cm,#4-1.15cm) circle (1.5mm);
+  }{}%
+  \ifthenelse{\equal{#1}{PLCC}}{%
+    \node[draw=black, rectangle,minimum width=#3,minimum height=#4,line width=1.5pt, chamfered rectangle, chamfered rectangle corners={north west}] at (#2) (case) {};
+    %\node[draw=black, circle,minimum size=1.5mm] at (#3*.5 cm,#4-1.25cm) (mark) {};
+    }{}%
+}
+
 %% PIN diagram with label decoding
 %% @param#1: options
 %% @param#2: offset
@@ -60,14 +78,26 @@
   % decode label
   \begin{scope}[shift={(#2)}]
     \def\pinlabel{#3}
-    \ifthenelse{\equal{#1}{right}}{%
+    \ifthenelse{\equal{#1}{right}}%
+    {%
       \draw (0.12,0) node[label=right:{\footnotesize \pinlabel},label=left:{\small \pgfmathprintnumber{#4}} ]{};
       \draw (0,-.15) rectangle(0.12,0.15);
-    }%
+    }{}
+    \ifthenelse{\equal{#1}{left}}%
     {%
-      \draw (0,0) node[label=left:{\footnotesize \pinlabel},label=right:{\small \pgfmathprintnumber{#4}} ]{};
-      \draw (0,-.15) rectangle(0.12,0.15);
-    }%
+      \draw (-0.12,0) node[label=left:{\footnotesize \pinlabel},label=right:{\small \pgfmathprintnumber{#4}} ]{};
+      \draw[rotate=180] (0,-.15) rectangle(0.12,0.15);
+    }{}
+    \ifthenelse{\equal{#1}{top}}%
+    {%
+      \draw(0,0.12) node[rotate=90,label=right:\rotatebox{90}{\footnotesize \pinlabel},label=left:\rotatebox{90}{\small \pgfmathprintnumber{#4}} ]{};
+      \draw[rotate=90](0,-.15) rectangle(0.12,0.15);
+    }{}
+    \ifthenelse{\equal{#1}{bottom}}%
+    {%
+      \draw(0,-0.12) node[rotate=90,label=left:\rotatebox{90}{\footnotesize \pinlabel},label=right:\rotatebox{90}{\small \pgfmathprintnumber{#4}} ]{};
+      \draw[rotate=-90](0,-.15) rectangle(0.12,0.15);
+    }{}
   \end{scope}
 }
 
@@ -85,7 +115,7 @@
     \pgfmathparse{#1/2}\let\cntstr\pgfmathresult
     \pgfmathparse{#1-1}\let\cntpinsr\pgfmathresult
     \pgfmathparse{\cntstr*.5}\let\height\pgfmathresult
-    \draw[line width=1.5pt] (0.12,-0.5) rectangle (1.88,\height);
+    \draw[line width=1.5pt] (0,-0.5) rectangle (1.88,\height);
     \draw (0.80,\height) arc (180:360:2mm);
     %iterate through pin definitions
     \foreach \pinnum/\i in {#2}%
@@ -108,6 +138,77 @@
   \end{tikzpicture}
 }
 
+% #1 - pin count
+% #2 - pin array
+% #3 - case type
+% #4 - pin offset
+\def\GENFOUREDGE(#1)#2#3#4{%
+    \sffamily
+    \textsf{%
+    \def\pins{{#2}}
+    \pgfmathparse{#1/4-1}\let\cntpinsl\pgfmathresult
+    \pgfmathparse{#1/4}\let\cntstr\pgfmathresult
+    \pgfmathparse{#1-1}\let\cntpinsr\pgfmathresult
+    \pgfmathparse{\cntstr*.4+.4}\let\height\pgfmathresult
+    \pgfmathparse{\height}\let\width\pgfmathresult
+    %\draw[line width=1.5pt] (-0.75,-0.75) rectangle (\width,\height);
+%    \node[draw=black, rectangle,minimum width=\width cm + 0.75 cm,minimum height=\height cm + 0.75 cm,line width=1.5pt, chamfered rectangle, chamfered rectangle corners={north west}] at (\width*.5-0.75*.5,\width*.5-0.75*.5) (case) {};
+    \CASE(#3){\width*.5-0.75*.5,\width*.5-0.75*.5}{\width cm + 0.75 cm}{\height cm + 0.75 cm}
+    %iterate through pin definitions
+    \foreach \pinnum/\i in {#2}%
+    {%
+      \pgfmathparse{\pinnum-1}\let\pinidx\pgfmathresult
+      \pgfmathparse{Mod((int(\pinidx+#1)-#4),#1)}\let\pinidx\pgfmathresult
+      \pgfmathparse{int(\pinidx/\cntstr)}\let\pinrange\pgfmathresult
+      \pgfmathparse{Mod(\pinidx,\cntstr)}\let\rngidx\pgfmathresult
+      \ifthenelse{\equal{\pinrange}{0} }%
+      {%
+        \pgfmathparse{(\cntpinsl-\rngidx)*0.40}\let\ypin\pgfmathresult
+        \PIN[left](-0.75,\ypin){\i}{\pinnum}
+      }{}
+      \ifthenelse{\equal{\pinrange}{1} }%
+      {%
+        \pgfmathparse{\rngidx*0.40}\let\ypin\pgfmathresult
+        \PIN[bottom](\ypin,-0.75){\i}{\pinnum}
+      }{}
+      \ifthenelse{\equal{\pinrange}{2} }%
+      {%
+        \pgfmathparse{\rngidx*0.40}\let\ypin\pgfmathresult
+        \PIN[right](\width,\ypin){\i}{\pinnum}
+      }{}
+      \ifthenelse{\equal{\pinrange}{3} }%
+      {%
+        \pgfmathparse{(\cntpinsl-\rngidx)*0.40}\let\ypin\pgfmathresult
+        \PIN[top](\ypin,\height){\i}{\pinnum}
+      }{}%      \fi
+    }
+  }
+}
+
+%% PLCC package diagram
+%% @param#1: offset
+%% @param#2: number of pins (divisible by 2)
+%% @param#3: comma separated definitions list for every pin - every pin definition must be enclosed in quotation marks ("")
+\def\PLCC(#1)#2{%
+  \begin{tikzpicture}
+  \begin{scope}[shift={(0,0)}]
+  \GENFOUREDGE(#1){#2}{PLCC}{round(#1*.125)}
+  \end{scope}
+  \end{tikzpicture}
+}
+
+%% TQFP package diagram
+%% @param#1: offset
+%% @param#2: number of pins (divisible by 2)
+%% @param#3: comma separated definitions list for every pin - every pin definition must be enclosed in quotation marks ("")
+\def\TQFP(#1)#2{%
+  \begin{tikzpicture}
+  \begin{scope}[shift={(0,0)}]
+  \GENFOUREDGE(#1){#2}{TQFP}{0}
+  \end{scope}
+  \end{tikzpicture}
+}
+
 %%
 
 \newlength{\pardefault}



More information about the tex-live-commits mailing list