[OS X TeX] Insert a column

Herbert Schulz herbs at wideopenwest.com
Thu Dec 21 14:14:16 EST 2006


On Dec 21, 2006, at 12:51 PM, Alain Schremmer wrote:

> Is there a way (other than by hand) to insert a new column in a 9  
> column table (with a couple of hundred rows) that is already partly  
> filled-in?
>
> Hopeful regards
> --schremmer

Howdy,

There are a set of TeXShop macros (written in Applescript) that  
create tables or arrays and can add/delete columns. I'm not sure if  
they came with TeXShop or I added them later and I don't have the  
name of the author either. Sigh...

To add a column select the rows of the tabular and use the Add Column  
macro. It will ask for the number of the column to add before/after  
and also whether it is before/after. There will be bullets as marks  
in the column contents so you can use the macros for finding bullets  
(these come with the Command Completion files I put together) to go  
to and select each mark so it is easy to add the new data.

New Tabular-------------
--Applescript direct

-- CUSTOMISE TO YOUR LIKING:
property indent : "  " -- edit this if you want other than 2 spaces  
for your indent
property cell_text : "• " -- edit this if you want a different text blob

tell application "TeXShop"
	set q1 to display dialog "New tabular" & return & return & "Enter  
the number of columns you'd like and then select the type of tabular  
you want." default answer "3" buttons {"Cancel", "Plain", "Booktabs"}  
default button "Booktabs"
	set NCOLS to the text returned of q1
	set tabtype to the button returned of q1
	
	set q2 to display dialog "Enter the number of rows you'd like (not  
including a header row) and select whether you'd like a floating or  
simply centred table." default answer "3" buttons {"Cancel",  
"Floating", "Centered"} default button "Centered"
	set NROWS to the text returned of q2
	set floattype to the button returned of q2
	
	if the tabtype = "Booktabs" then
		set the toprule to "\\toprule"
		set the midrule to "\\midrule"
		set the bottomrule to "\\bottomrule"
	else
		set the toprule to "\\hline"
		set the midrule to "\\hline"
		set the bottomrule to "\\hline"
	end if
	
	if the floattype = "Floating" then
		set the beforetext to ¬
			"\\begin{table}[htbp]" & return & ¬
			indent & "\\centering" & return & ¬
			indent & "\\begin{tabular}" -- note no carriage return to allow  
space for the column preamble
		set the aftertext to ¬
			indent & indent & bottomrule & return & ¬
			indent & "\\end{tabular}" & return & ¬
			indent & "\\caption{TableCaption}" & return & ¬
			indent & "\\label{tab:label}" & return & ¬
			"\\end{table}"
	else
		set the beforetext to ¬
			"\\begin{center}" & return & ¬
			indent & "\\begin{tabular}"
		set the aftertext to ¬
			indent & indent & bottomrule & return & ¬
			indent & "\\end{tabular}" & return & ¬
			"\\end{center}"
	end if
	
	set the column_preamble to "{@{} c"
	set the one_row_text to indent & indent & cell_text
	
	if NCOLS > 1 then
		repeat with c from 2 to NCOLS
			set the column_preamble to column_preamble & "c"
			set the one_row_text to one_row_text & "& " & cell_text
		end repeat
	end if
	
	set the column_preamble to column_preamble & " @{}}" & return
	set the one_row_text to one_row_text & "\\\\ "
	
	-- start off with a header row between two rules:
	set the midtext to ¬
		indent & indent & toprule & return & ¬
		one_row_text & return & ¬
		indent & indent & midrule & return
	
	repeat with r from 1 to NROWS
		set the midtext to midtext & one_row_text & return
	end repeat
	
	set alltext to beforetext & column_preamble & midtext & aftertext
	
	tell application "TeXShop" to set the content of the selection of  
the front document to alltext
	
end tell
End New Tabular------------------
New Array----------------------
--Applescript direct

-- CUSTOMISE TO YOUR LIKING:
property indent : "  " -- edit this if you want other than 2 spaces  
for your indent
property cell_text : "• " -- edit this if you want a different text blob

tell application "TeXShop"
	set q2 to display dialog "New maths array." & return & return &  
"Enter the number of rows you'd like." default answer "3"
	set NROWS to the text returned of q2
	
	set q1 to display dialog "How many columns would you like? Would you  
like me to indent the array?" default answer "3" buttons {"Cancel",  
"Indent", "Flush left"} default button "Flush left"
	set NCOLS to the text returned of q1
	set indentyesno to the button returned of q1
	
	if the indentyesno = "Indent" then
		set the preindent to indent
	else
		set the preindent to ""
	end if
	
	set the column_preamble to "{c"
	set the one_row_text to preindent & indent & cell_text
	
	if NCOLS > 1 then
		repeat with c from 2 to NCOLS
			set the column_preamble to column_preamble & "c"
			set the one_row_text to one_row_text & "& " & cell_text
		end repeat
	end if
	
	set the column_preamble to column_preamble & "}" & return
	set the one_row_text to one_row_text & "\\\\ " & return
	
	set midtext to ""
	repeat with r from 1 to NROWS
		set the midtext to midtext & one_row_text
	end repeat
	
	set the beforetext to preindent & "\\begin{array}"
	set the aftertext to preindent & "\\end{array}"
	
	set alltext to beforetext & column_preamble & midtext & aftertext
	
	tell application "TeXShop" to set the content of the selection of  
the front document to alltext
end tell
End New Array---------------------
New Column----------------------
--Applescript direct

-- CUSTOMISE AS YOU LIKE:
property indent : "  "
property default_button : "After" -- or "Before"
property cell_blob : "•"

--BEGIN:

tell application "TeXShop"
	set q to display dialog "This macro adds a new column to the  
selected tabular. Please enter the column number before or after  
which you would like to add a new column." default answer "1" buttons  
{"Before", "After"} default button default_button
	
	set add_where to the button returned of q
	set col_num to the text returned of q
	
	tell application "TeXShop" to set tabular to the content of the  
selection of the front document
	
	set new_tabular to ""
	repeat with ii from 1 to the count of the paragraphs of tabular
		
		set this_line to paragraph ii of tabular
		
		if this_line contains "\\\\" and this_line does not contain "\ 
\multicolumn" then
			
			--Transform "    a & b & c \\" to "a & b & c":
			set trim_line to do shell script ¬
				"echo " & the quoted form of this_line & ¬
				" | sed 's/^[ ^t]*//' | sed 's/\\\\\\\\//'"
			-- "\\\\\\\\" is a TeX newline escaped in both Applescript and the  
shell
			
			
			set new_col to "& " & cell_blob & " &"
			if add_where = "After" then
				set line_start to do shell script "echo " & the quoted form of  
trim_line & " | cut -f -" & col_num & " -d '&'"
				set line_end to do shell script "echo " & the quoted form of  
trim_line & " | cut -f " & col_num + 1 & "- -d '&'"
				if line_end = "" then
					set new_col to "& " & cell_blob & " "
				end if
			else if add_where = "Before" then
				if col_num = "1" then
					set line_start to ""
					set new_col to cell_blob & " & "
					set line_end to trim_line
				else
					set line_start to do shell script "echo " & the quoted form of  
trim_line & " | cut -f -" & col_num - 1 & " -d '&'"
					set line_end to do shell script "echo " & the quoted form of  
trim_line & " | cut -f " & col_num & "- -d '&'"
					if line_end = "" then
						set new_col to "& " & cell_blob & " "
					end if
				end if
			end if
			
			set new_line to indent & indent & line_start & new_col & line_end  
& "\\\\"
			if new_tabular = "" then
				set new_tabular to new_line
			else
				set new_tabular to new_tabular & return & new_line
			end if
		else
			if new_tabular = "" then
				set new_tabular to this_line
			else
				set new_tabular to new_tabular & return & this_line
			end if
		end if
		
	end repeat
	
	if tabular contains "\\multicolumn" then
		display dialog "I cannot parse lines with “\\multicolumn” in them.  
You'll have to do them by hand. Sorry." buttons {"Cancel", "Proceed"}  
default button "Proceed" with icon caution
	end if
	
	tell application "TeXShop" to set the selection of the front  
document to new_tabular
	
	display dialog "Don't forget to change the column header!" buttons  
{"•"} giving up after 4
	
end tell
End New Column----------------
Delete Column-----------------
--Applescript direct

property indent : "  "

--BEGIN:
tell application "TeXShop"
	
	set tabular to the content of the selection of the front document
	
	if tabular = "" then
		display dialog "Nothing selected. Please select the tabular/array  
rows you wish to edit." buttons "Cancel" default button 1
	end if
	
	set q to display dialog "Please enter the number of the column you  
would like to delete." default answer "1" buttons {"Cancel",  
"Delete"} default button "Delete"
	
	set col_num to the text returned of q
	
	
	set sample_value to ""
	set new_tabular to ""
	repeat with ii from 1 to the count of the paragraphs of tabular
		
		set this_line to paragraph ii of tabular
		
		if this_line contains "\\\\" and this_line does not contain "\ 
\multicolumn" then
			-- note "\\\\" means \\ because the backslashes are escaped
			
			--Transform "    a & b & c \\" to "a & b & c":
			set trim_line to do shell script ¬
				"echo " & the quoted form of this_line & ¬
				" | sed 's/^[ ^t]*//' | sed 's/\\\\\\\\//'"
			-- "\\\\\\\\" is a TeX newline escaped in both Applescript and the  
shell
			
			set new_col to "&"
			if sample_value = "" then
				set sample_value to do shell script "echo " & the quoted form of  
trim_line & " | cut -f " & col_num & "-" & col_num & " -d '&'"
			end if
			if col_num = "1" then
				set line_start to ""
				set line_end to do shell script "echo " & the quoted form of  
trim_line & " | cut -f " & col_num + 1 & "- -d '&'"
				set new_col to ""
			else
				set line_start to do shell script "echo " & the quoted form of  
trim_line & " | cut -f -" & col_num - 1 & " -d '&'"
				set line_end to do shell script "echo " & the quoted form of  
trim_line & " | cut -f " & col_num + 1 & "- -d '&'"
				if line_end = "" then
					set new_col to ""
				end if
			end if
			
			
			set new_line to indent & indent & line_start & new_col & line_end  
& "\\\\"
			if new_tabular = "" then
				set new_tabular to new_line
			else
				set new_tabular to new_tabular & return & new_line
			end if
		else
			if new_tabular = "" then
				set new_tabular to this_line
			else
				set new_tabular to new_tabular & return & this_line
			end if
		end if
		
	end repeat
	
	display dialog "Are you sure you want to delete the column that  
begins with “" & sample_value & "”?" buttons {"Cancel", "Delete"}  
default button "Delete"
	
	if tabular contains "\\multicolumn" then
		display dialog "I cannot parse lines with “\\multicolumn” in them.  
You'll have to do them by hand. Sorry." buttons {"Cancel", "Proceed"}  
default button "Proceed" with icon caution
	end if
	
	tell application "TeXShop" to set the selection of the front  
document to new_tabular
	
	display dialog "Don't forget to delete columns from the column  
header!" buttons {"•"} giving up after 4
	
end tell
End Delete Column-------------------

Will the person who wrote these macros please sand up! :-)
Hope I have permission to put them in this message.

Good Luck,

Herb Schulz
(herbs at wideopenwest.com)



------------------------- Helpful Info -------------------------
Mac-TeX Website: http://www.esm.psu.edu/mac-tex/
TeX FAQ: http://www.tex.ac.uk/faq
List Archive: http://tug.org/pipermail/macostex-archives/
List Reminders & Etiquette: http://www.esm.psu.edu/mac-tex/list/





More information about the MacOSX-TeX mailing list