[OS X TeX] How to copy and paste tables into LaTeX (from Excel or other programs)?

Bernhard Barkow bb at creativeeyes.at
Tue Dec 6 12:51:45 CET 2005


Hi,

On 06.12.2005, at 09:19, Jan Hegewald wrote:
> Am 06.12.2005 um 08:29 schrieb Bernhard Barkow:
>
>> Wouldn't it be relatively easy (for an AppleScript expert, I mean)  
>> to write an import macro for TeXShop which parses the available  
>> clipboard data and creates a LaTeX table from it, with &s and \\s  
>> etc.? I don't know if that's possible at all, just had the idea...
>
> Some time ago I wrote an AppleScript which parses the clipboard to  
> insert the required & and \\ into a table data copied from Excel.  
> It only works for the rows. So you have to write the \tabular  
> header for yourself. If anyone is interested, I can see if I can  
> find it. Currently I use a ruby script to do this converting.

I played around a little and came up with the script below. It takes  
tabular data from the clipboard, tries to find out how it is  
structured (tab- or comma-delimited etc.), asks for some options and  
then creates the tabular environment and inserts it into the document  
(replacing a current selection, if present).
The result will probably still need some editing by the user. I don't  
know if it works with Excel (I don't have Excel), but it works from  
an AppleWorks spreadsheet, at least.
I didn't have time to check extensively for bugs, and there are  
certainly lots of possible improvements (especially the handling of  
white space is not very sophisticated yet), but maybe it helps;  
although it won't be as powerful as an external ruby or python  
script, I suppose.
Actually, I don't know why I didn't have that idea before, given my  
previous frustrations about importing tables into LaTeX...

	Bernhard


/* AppleScript: copy the code below and paste it into a new TeXShop  
macro (Macros / Open Macro Editor… / New Item) */

--AppleScript direct
-- converts tabular clipboard data to LaTeX
-- Bernhard Barkow 2005
property kColSep : " & " as string
property kSeparators : {tab, ";", space}
property kDlgTitle : "Tabular data import"
property kHline : "\\hline"

tell application "TeXShop"
	-- prepare the clipboard data
	set cbd to the clipboard as string
	set cbl to paragraphs of cbd
	set tmpStr to the first item in cbl
	set sepChar to my getColSepChar(tmpStr)
	
	-- createthe  table header
	set outText to "\\begin{tabular}{"
	set nColumns to my countSubstr(tmpStr, sepChar)
	set colDefText to ""
	-- get user input
	set colJust to text returned of (display dialog "Default column  
justification (l,c,r,c|,…):" default answer "c" with title kDlgTitle  
buttons {"OK"} default button 1)
	if (colJust = "") then set colJust to "c"
	set doHline to (button returned of (display dialog "Add \\hline?"  
with title kDlgTitle buttons {"Yes", "No"} default button 2) = "Yes")
	set tabLineBreak to " \\\\"
	set daLineSpc to (display dialog "Extra line spacing:" default  
answer "0pt" with title kDlgTitle buttons {"Ok", "None"} default  
button 1)
	-- append vertical spacing if required:
	if (button returned of daLineSpc = "Ok") then set tabLineBreak to  
tabLineBreak & "[" & (text returned of daLineSpc) & "]"
	if (doHline) then set tabLineBreak to tabLineBreak & return & kHline
	repeat with i from 1 to nColumns
		--if (i > 1) then set colDefText to colDefText & "|"
		set colDefText to colDefText & colJust
	end repeat
	set colDefText to colDefText & "}"
	set outText to outText & colDefText
	if (doHline) then set outText to outText & return & kHline
	
	-- split lines into columns
	set nLines to count (cbl)
	repeat with i from 1 to nLines
		set tmpStr to (item i of cbl)
		if (my countSubstr(tmpStr, sepChar) > 1) then
			set tableLine to return & my searchReplace(tmpStr, sepChar, kColSep)
			if (i < nLines or doHline) then
				set tableLine to tableLine & tabLineBreak
			end if
			set outText to outText & tableLine
		end if
	end repeat
	
	-- finalize the table
	set outText to outText & return & "\\end{tabular}"
	-- insert the converted tabular data int the document
	set selection of front document to outText
end tell

-- try to find the proper column separator
on getColSepChar(txtStr)
	repeat with ch in kSeparators
		set sepChar to contents of ch
		if (txtStr contains sepChar) then exit repeat
	end repeat
	return sepChar
end getColSepChar

-- replace searchStr by replStr in txtStr
on searchReplace(txtStr, searchStr, replStr)
	set {oldDelims, text item delimiters} to {text item delimiters,  
searchStr}
	set newText to text items of txtStr
	set text item delimiters to replStr
	set newText to newText as text
	set text item delimiters to oldDelims
	return newText
end searchReplace

-- count the occurrences of searchStr in txtStr
on countSubstr(txtStr, searchStr)
	set {oldDelims, text item delimiters} to {text item delimiters,  
searchStr}
	set newText to text items of txtStr
	set n to count newText
	set text item delimiters to oldDelims
	return n
end countSubstr


------------------------- Info --------------------------
Mac-TeX Website: http://www.esm.psu.edu/mac-tex/
          & FAQ: http://latex.yauh.de/faq/
TeX FAQ: http://www.tex.ac.uk/faq
List Archive: http://tug.org/pipermail/macostex-archives/




More information about the macostex-archives mailing list