2011-07-04 16 views
7

Jeśli spojrzysz na pakiet Combinatorica w Mathematica8 w (mathematicapath)/AddOns/LegacyPackages/DiscreteMath/Combinatorica.m, znajdziesz definicje funkcji. Interesuje mnie to, jak Mathematica wie, jak sformatować komunikaty o użytkowaniu. Coś mi mówi, że nie patrzę na właściwy plik. W każdym razie spróbujmy:Formatowanie wiadomości o używaniu

Cofactor::usage = "Cofactor[m, {i, j}] calculates the (i, j)th cofactor of matrix m." 

Ta linia to wiersz 682 w powyższym pliku. Teraz, jeśli uruchomimy go w matematycznym notatniku i użyjemy ?Cofactor, zobaczymy dokładnie tę samą wiadomość. Ale jeśli dostaniemy pakiet, to wiadomość zostanie sformatowana. Oto zrzut ekranu:

enter image description here

Wskazówki, jak m, I i J wewnątrz funkcji zmieniło i podwójną strzałkę został dodany do wiadomości. Myślę, że strzałka została dodana do wiadomości, ponieważ istnieje dla niej dokumentacja. Czy ktoś może wyjaśnić to zachowanie?


EDIT: To jest zrzut ekranu z mojego pliku notebooka że autosaves do pliku m.

enter image description here

Jak widać, L i M są kursywą Times New Roman. Teraz załaduję pakiet i zobaczę użycie.

enter image description here

tej pory tak dobrze. Teraz spójrzmy na centrum dokumentacji. Poszukam funkcji LineDistance.

enter image description here

Jak widać, to widać dziwną wiadomość. W tym przypadku chcemy wyświetlić komunikat bez żadnych stylów. Nadal nie mogę zrozumieć, jak robi to pakiet Combinatorica. Śledziłem this, aby utworzyć indeks, aby centrum docen mogło wyświetlać podsumowanie. Podsumowanie jest w zasadzie wyświetlaniem użycia. Daj mi znać, jeśli chcę być bardziej szczegółowy.

Odpowiedz

1

OK, oto wyjaśnienie.

Kopanie w źródle Combinatorica to ujawnia:

(* get formatted Combinatorica messages, except for special cases *) 
If[FileType[ToFileName[{System`Private`$MessagesDir,$Language},"Usage.m"]]===File, 
Select[FindList[ToFileName[{System`Private`$MessagesDir,$Language},"Usage.m"],"Combinatorica`"], 
StringMatchQ[#,StartOfString~~"Combinatorica`*"]&& 
!StringMatchQ[#,"Combinatorica`"~~("EdgeColor"|"Path"|"Thin"|"Thick"|"Star"|"RandomInteger")~~__]&]//ToExpression; 
] 

jest ładowanie wiadomości z ToFileName[{System`Private`$MessagesDir,$Language},"Usage.m"], który na moim komputerze jest SystemFiles\Kernel\TextResources\English\Usage.m.Dlatego wszystkie wiadomości o używaniu są tworzone warunkowo w Combinatorica.m (tylko jeśli nie istnieją). Jeśli spojrzysz w Usage.m zobaczysz, że ma wszystkie brzydkie pudełka, o których wspominał @ragfield.

Domyślam się, że najprostszym sposobem na sformatowanie wiadomości jest ich edycja z przodu komputera przenośnego i utworzenie pakietu automatycznego zapisywania. W ten sposób możesz korzystać ze wszystkich narzędzi formatujących interfejsu i nie będziesz musiał zajmować się skrzynkami.

+0

To właśnie robię. Formatuję wiadomości w notatniku i automatycznie zapisuję je w paczce. Wszystko wydaje się w porządku, ale przeszkadza mi to, że jeśli wyszukasz je w Centrum dokumentacji, zobaczysz także wszystkie pola. Zastanawiam się, czy będę musiał mieć osobny plik 'Usage.m' z sformatowaną wersją. Jeśli tak, to gdzie byłby umieszczony? – jmlopez

+0

@jmlopez Nie rozumiem, co masz na myśli: "jeśli wyszukasz to w Centrum dokumentacji, zobaczysz także wszystkie pola". Jeśli nigdy nie edytujesz bezpośrednio pliku .m, nie ma powodu, aby mieć osobny plik dla wiadomości. Jeśli to zrobisz, możesz zarezerwować pakiet automatycznego zapisywania tylko dla wiadomości, umieścić wynikowy plik .m w tym samym katalogu, w którym znajduje się twój pakiet (lub jego podkatalog) i odczytać go z głównego pliku pakietu. – Szabolcs

+0

Pozwól mi edytować mój wpis i dodaj zrzut ekranu, abyś mógł zobaczyć, co mam na myśli. – jmlopez

1

Sposób osadzania informacji o stylach w wyrażeniu łańcuchowym polega na użyciu składni liniowej. Dla wyrażenia skrzynki takie jak:

StyleBox["foo", FontSlant->Italic] 

Możesz umieścić ten wnętrze String dodając \* do przodu to i ucieczki znaków specjalnych, takich jak cudzysłów:

"blah \*StyleBox[\"foo\", FontSlant->Italic] blah" 

To powinno działać na dowolne wyrażenie w polu, nie ważne jak skomplikowane:

"blah \*RowBox[{SubsuperscriptBox[\"\[Integral]\",\"0\",\"1\"],RowBox[{FractionBox[\"1\",RowBox[{\"x\",\"+\",\"1\"}]],RowBox[{\"\[DifferentialD]\",\"x\"}]}]}] blah" 
+2

byłem tego świadomy. Problem polega na tym, że jeśli dokumentuję moje funkcje i formatuję komunikaty o używaniu, wtedy gdy je wyszukuję, podsumowanie, które otrzymuję, zawiera wszystkie '\ * StyleBox [...'. Wtedy zauważyłem, że w pakiecie 'Combinatorica' nie formatują niczego, więc ich streszczenie wychodzi bez żadnego formatu. Jednakże, kiedy używasz '? NameofFunction', masz ładny format. Jak to się robi? – jmlopez

2

Będę odpowiedzieć na temat, w jaki sposób generowany jest link w Message. Śledzenia Message drukowanie przedstawia wywołanie nieudokumentowane Documentation`CreateMessageLink funkcji, która zwraca adres URL do odpowiedniej strony Documentation jeśli ta strona istnieje:

Trace[Information[Sin], Documentation`CreateMessageLink] 

In[32]:= Documentation`CreateMessageLink["System", "Sin", "argx", "English"] 

Out[32]= "paclet:ref/message/General/argx" 

W niektórych przypadkach możemy również zobaczyć połączenia do Internal`MessageButtonHandler które wzywa ponadto Documentation`CreateMessageLink:

Trace[Message[Sin::argx, 1, 1], 
Internal`MessageButtonHandler | Documentation`CreateMessageLink, 
TraceInternal -> True] 
0

Obecnie pracuję nad przepisaniem Twojego ApplicationMaker dla nowszych wersji Mathematica z dodatkowymi funkcjami i trafiłem dokładnie na to samo pytanie tutaj.

Moja odpowiedź jest prosta: Mathematica Dont allowes używanie formatowany zestawień dla symboli (lub nawet zbudować w symbolach), więc musimy unformate użytkowania-strings do podsumowań. Samo usagestring może nadal mieć formatowanie, ale trzeba mieć funkcję, która usuwa wszystkie formaty z łańcucha.

Mam rozwiązanie, które używa UndocumentedTestFEParserPacket zgodnie z opisem podanym przez John Fultz! w pytaniu this.

To zabawne narzędzie nazwane analizuje dane wejściowe ciągu do rzeczywistego niezmienionego Mathematica BoxForm.

To jest mój przykładowy kod:

str0 = Sum::usage 

str1=StringJoin[ToString[StringReplace[#, "\\\"" -> "\""]]& /@ 
(Riffle[MathLink`CallFrontEnd[ 
FrontEnd`UndocumentedTestFEParserPacket[str0, True]]〚1〛 
//. RowBox[{seq___}] :> seq /. BoxData -> List, " "] 
/. SubscriptBox[a_, b_] :> a<>"_"<>b 
/. Except[List, _Symbol][args__] :> [email protected]@Riffle[{args}, " "])]; 

str2 = Fold[StringReplace, str1, 
{((WhitespaceCharacter...)~~br:("["|"("|"=") ~~ (WhitespaceCharacter ...)) :> br, 
((WhitespaceCharacter ...) ~~ br:("]"|"}"|","|".")) :> br, 
(br:("{") ~~ (WhitespaceCharacter ...)) :> br, 
". " ~~ Except[EndOfString] -> ". \n"}] 

i to jak wyjście wygląda (pierwsze wyjście sformatowane fantazyjny str0, drugi prosty płaski str2)

first Output formatted fancy str0, second simple flat str2

code Objaśnienie:

str0 to sformatowane usagestring ze wszystkimi elementami StyleBox i innymi formatami.

str1:

UndocumentedTestFEParserPacket[str0, True] daje Skrzynki i Odcina wszystko StyleBoxes, ponieważ ów drugi argument jest prawda. Pierwsza wymiana usuwa wszystkie RowBoxes. Zewnętrzna BoxForm zmieniona na Listę łańcuchów. Białe spacje są wstawiane między tymi ciągami przez Riffle. SubscriptBox otrzymuje specjalne traktowanie. Ostatnia linia zastępuje wszystkie pozostałe formaty FormatBox, takie jak UnderoverscriptBox i robi to poprzez dodanie Białych spacji między argumentami i zwrócenie argumentów jako płaskiej Sekwencji.

został dodany, aby uwzględnić więcej przypadków, takich jak StringReplace::usage.Przypadki te obejmują ciągi reprezentacji "" z stylami wewnątrz ciągu użycia, gdy "args" musi być podany jako ciągi.

słowo2:

W tym bloku kodu i tylko usunąć niechciane WhitespaceCharacter z str1 smyczkową i dodać linebreaks "/n" po ".", bo zgubił podczas parsowania. Istnieją 3 różne przypadki, w których można usunąć WhitespaceCharacter. 1 usuwanie lewej i prawej strony WithespaceCharacter z postaci takiej jak "[". 2. i 3. usuwanie WithespaceCharacter od lewej (2) lub prawej (3) strony.

Streszczenie

istead summary-> mySymbol::usage użyć summary -> unformatString[mySymbol::usage] z unformatString jest odpowiednia funkcja performes z unformating jak opisany jest powyżej.

Alternatywnie można zdefiniować inny komunikat o użytkowaniu ręcznie jak

f::usage = "fancy string with formating"; 
f::usage2 = "flat string without formating"; 

niż Podsumowując używania -> mySymbol :: usage2

Powiązane problemy