I really like the macro feature of
TexShop. One of the most common use cases of macros would probably be the definition of a section (or subsection etc.). My section-creation-macro has been quite simple in the past:
% ----------------------------------------
% \section{#SEL##INS#}
% \label{sec:#SEL#}
% ----------------------------------------
This small snippet creates a nicely formatted section header including a label. However, there's a really annoying problem: When creating a reference to a section (that is, to its label), TeXShop does not handle spaces accordingly when selecting a label from the dropdown list. For example, if your label is something like \label{sec:Hello World}, the complete label is shown in the list, but only \ref{sec:Hello} is inserted into the text. In order to overcome this problem, I always replace spaces in labels with underscores. So my label would be "sec:Hello_World", and TeXShop is working perfectly.
But replacing spaces with underscores by hand is even more annoying. So I replaced my section macro with an applescript version:
--Applescript direct
-- Create a section header from selected text. A label is automatically added with a prefix
-- "sec:", spaces are converted to underscores.
-- (C) 2010 Jens von Pilgrim
property level : "section"
property cmtchar : "-"
property cmtlength : 78
property labelprefix : "sec:"
-- property newline: "\n"
tell application "TeXShop"
tell application "TeXShop" to set title to the content of the selection of the front document
set new_title to title
if ((count of the paragraphs of title) ≥ 1) then
set this_line to paragraph 1 of title
set label to this_line
set add to "true"
-- replace commands
set label to do shell script ¬
"echo " & the quoted form of label & ¬
" | sed -E 's/([[:space:]]|[[:punct:]])/_/g'"
set comment to "% "
repeat with ii from 1 to cmtlength
set comment to comment & cmtchar
end repeat
set new_title to ¬
comment & return & ¬
"\\" & level & "{" & title & "}" & return & ¬
"\\label{" & labelprefix & label & "}" & return & ¬
comment & return
end if
tell application "TeXShop" to set the selection of the front document to new_title
end tell
This macro creates a section just like the initial macro version, but this time spaces are automatically replaced in the label. That is, simply select your section title, activate the macro, and you get a nicley formatted title with a TeXShop compatible label. E.g.
Mark
Hello World, this is great
and the macro will convert this to
% ==============================================================================
\section{Hello World, this is great}
\label{sec:Hello_World__this_is_great}
% ==============================================================================
You can easily adjust the macro in order to create subsection, subsubsections or chapters as well. I have different kind of comments for different section levels, all you have to change are the properties in the first line:
...
property level : "section"
property cmtchar : "-"
property cmtlength : 78
property labelprefix : "sec:"
...
Change level to "subsection" or whatever, and set the cmtchar to "*", "." or whatever you like.
Changing a section level has already been subject of another blog post:
Increase/Decrease Section Level with TeXShop Macros.
I really like the macro feature of
TexShop. One of the most common use cases of macros would probably be the definition of a section (or subsection etc.). My section-creation-macro has been quite simple in the past:
% ----------------------------------------
% \section{#SEL##INS#}
% \label{sec:#SEL#}
% ----------------------------------------
This small snippet creates a nicely formatted section header including a label. However, there's a really annoying problem: When creating a reference to a section (that is, to its label), TeXShop does not handle spaces accordingly when selecting a label from the dropdown list. For example, if your label is something like \label{sec:Hello World}, the complete label is shown in the list, but only \ref{sec:Hello} is inserted into the text. In order to overcome this problem, I always replace spaces in labels with underscores. So my label would be "sec:Hello_World", and TeXShop is working perfectly.
But replacing spaces with underscores by hand is even more annoying. So I replaced my section macro with an applescript version:
--Applescript direct
-- Create a section header from selected text. A label is automatically added with a prefix
-- "sec:", spaces are converted to underscores.
-- (C) 2010 Jens von Pilgrim
property level : "section"
property cmtchar : "-"
property cmtlength : 78
property labelprefix : "sec:"
-- property newline: "\n"
tell application "TeXShop"
tell application "TeXShop" to set title to the content of the selection of the front document
set new_title to title
if ((count of the paragraphs of title) ≥ 1) then
set this_line to paragraph 1 of title
set label to this_line
set add to "true"
-- replace commands
set label to do shell script ¬
"echo " & the quoted form of label & ¬
" | sed -E 's/([[:space:]]|[[:punct:]])/_/g'"
set comment to "% "
repeat with ii from 1 to cmtlength
set comment to comment & cmtchar
end repeat
set new_title to ¬
comment & return & ¬
"\\" & level & "{" & title & "}" & return & ¬
"\\label{" & labelprefix & label & "}" & return & ¬
comment & return
end if
tell application "TeXShop" to set the selection of the front document to new_title
end tell
This macro creates a section just like the initial macro version, but this time spaces are automatically replaced in the label. That is, simply select your section title, activate the macro, and you get a nicley formatted title with a TeXShop compatible label. E.g.
Mark
Hello World, this is great
and the macro will convert this to
% ==============================================================================
\section{Hello World, this is great}
\label{sec:Hello_World__this_is_great}
% ==============================================================================
You can easily adjust the macro in order to create subsection, subsubsections or chapters as well. I have different kind of comments for different section levels, all you have to change are the properties in the first line:
...
property level : "section"
property cmtchar : "-"
property cmtlength : 78
property labelprefix : "sec:"
...
Change level to "subsection" or whatever, and set the cmtchar to "*", "." or whatever you like.
Changing a section level has already been subject of another blog post:
Increase/Decrease Section Level with TeXShop Macros.
Create Section Headers with TexShop and Applescript
No comments:
Post a Comment